Хотя стандарт C не требует этого, он НАСТОЯТЕЛЬНО РЕКОМЕНДУЕТ, чтобы float
и double
были стандартными типами с плавающей точкой одинарной и двойной точности IEEE 754, соответственно. Какие они есть на любой архитектуре, которая поддерживает их в аппаратном обеспечении (что означает практически везде).
С long double
все немного сложнее, так как не многие архитектуры поддерживают типы с плавающей запятой с точностью выше двойной. Стандарт требует, чтобы long double
имел как минимум такой же диапазон и точность, что и double
. Это означает, что если архитектура больше не поддерживает ничего, тип long double
идентичен double
. И даже если делает (например, x87), некоторые компиляторы по-прежнему делают long double
эквивалентным double
(например, M $ VC), в то время как другие предоставляют расширенный тип точности как long double
(например, Borland и НКУ).
Даже если компилятор предоставляет тип расширенной точности, все еще нет стандарта для того, что именно означает «расширенная точность». На х87 это 80 бит. Некоторые другие архитектуры имеют 128-битные типы с четверной точностью. Даже на x87 некоторые компиляторы имеют sizeof(long double)
= 10, в то время как другие дополняют его для выравнивания, так что оно равно 12 или 16 (из 8, если long double
равно double
).
Итак, суть в том, что реализация long double
зависит от платформы. Единственное, в чем вы можете быть уверены, это то, что оно по крайней мере эквивалентно double
. Если вы хотите написать переносимый код, не зависите от его представления - держите его подальше от интерфейсов и двоичного ввода-вывода. Использование long double
во внутренних вычислениях вашей программы - это нормально.