Cel ".f " dołączony do numeru?

Widziałem " 1/3.f "w programie, i zastanawiał się, co".f " było dla. Więc wypróbowałem własny program:

#include<iostream>
using namespace std;
int main()
{
        cout<<(float)1/3<<endl;
        cout<<1/3.f<<endl;
        cout<<1/3<<endl;
}

Jest .f używane jak gips? Gdzie mogę poczytać więcej o tej ciekawej składni?

Author: Nav, 2011-01-28

5 answers

Bez .f liczba jest interpretowana jako liczba całkowita, stąd 1/3 jest (int)1/(int)3 => (int)0 zamiast pożądanego (float)0.333333. .f mówi kompilatorowi, aby interpretował literał jako liczbę zmiennoprzecinkową typu float. Istnieją inne tego typu konstrukcje, takie jak na przykład {[6] } co oznacza (unsigned long)0, podczas gdy zwykły 0 byłby (int)0.

.f są w rzeczywistości dwoma składnikami, ., co wskazuje, że literał jest liczbą zmiennoprzecinkową, a nie liczbą całkowitą. f sufiks mówiący kompilatorowi, że literał powinien być typu float, a nie domyślnego typu double używanego dla literałów zmiennoprzecinkowych.

Disclaimer; "konstrukcja obsady" użyta w powyższym wyjaśnieniu nie jest rzeczywistą obsadą, ale tylko sposobem na wskazanie typu dosłownego.

Jeśli chcesz wiedzieć wszystko o literałach i przyrostkach, których możesz w nich używać, możesz przeczytać standard C++, ( 1997 draft, C++11 draft, C++14 draft , [[29]}C++17 draft ) lub alternatywnie, spójrz na porządny podręcznik, taki jak Stroustrup język programowania C++ .

Na marginesie, w twoim przykładzie (float)1/3 literały 1 i 3 są w rzeczywistości liczbami całkowitymi, ale 1 jest najpierw rzucane do float przez twój cast, a następnie 3 jest domyślnie rzucane do float, ponieważ jest to prawostronny operand operatora zmiennoprzecinkowego. (Operator jest zmiennoprzecinkowy, ponieważ jego lewy operand jest zmiennoprzecinkowy punkt.)

 42
Author: wich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-23 14:34:08

3. jest równoważne 3.0, jest podwójne.

f podążanie za liczbą literalną sprawia, że jest to float.

 53
Author: peoro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-28 12:25:00

Domyślnie 3.2 jest traktowane jako double; więc aby zmusić kompilator do traktowania go jako float, musisz napisać f na końcu.

Wystarczy zobaczyć tę ciekawą demonstrację:

float a = 3.2;
if ( a == 3.2 )
    cout << "a is equal to 3.2"<<endl;
else
    cout << "a is not equal to 3.2"<<endl;

float b = 3.2f;
if ( b == 3.2f )
    cout << "b is equal to 3.2f"<<endl;
else
    cout << "b is not equal to 3.2f"<<endl;

Wyjście:

A nie jest równa 3,2
b jest równe 3.2 f

Eksperymentuj tutaj w ideone: http://www.ideone.com/WS1az

Spróbuj zmienić typ zmiennej a z float na double, Zobacz wynik ponownie!

 17
Author: Nawaz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-28 12:37:34

3.F jest skrótem od 3.0 f-Liczba 3.0 jako literał zmiennoprzecinkowy typu float.

 8
Author: jcoder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-28 12:24:52

Punkt dziesiętny i f mają inny cel, więc tak naprawdę nie jest .f

Musisz zrozumieć, że w C i c++ wszystko jest pisane, w tym literały.

3 jest literalną liczbą całkowitą. 3. jest dosłownym podwójnym 3.f jest literalnym pływakiem.

Zmiennoprzecinkowy IEEE ma mniejszą precyzję niż podwójny. float używa tylko 32 bitów, z 22-bitowym mantysem i 10-bitowym wykładnikiem (łącznie z bitami znakowymi każdego z nich).

Double daje większą dokładność, ale czasami nie potrzebujesz takiej dokładność (np. jeśli wykonujesz obliczenia na liczbach, które są tylko szacunkami) i podana przez float wystarczy, a jeśli przechowujesz ich dużą liczbę (np. przetwarzasz wiele danych szeregów czasowych), która może być ważniejsza niż dokładność.

Float jest więc nadal użytecznym typem.

Nie należy mylić tego z zapisem używanym przez printf i równoważne wyrażenia.

 2
Author: CashCow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-28 12:40:57