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?
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.)
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.
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!
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.
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.
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