Я пришел, ища знания.
Я пытаюсь понять числа с плавающей запятой.
Я пытаюсь понять, почему, когда я печатаю наибольшее число с плавающей запятой, оно не печатает правильно.печать наибольшее число с плавающей точкой с одинарной точностью
2-(2^-23) Exponent Bits
1.99999988079071044921875 * (1.7014118346046923173168730371588e+38) =
3.4028234663852885981170418348451e+38
Это должно быть наибольшее число одинарной точности с плавающей точкой:
340282346638528859811704183484510000000.0
Так,
float i = 340282346638528859811704183484510000000.0;
printf(TEXT, "Float %.38f", i);
Output: 340282346638528860000000000000000000000.0
Очевидно, число округляется вверх, так что я пытаюсь выяснить, точно, что происходит.
Мои вопросы: В документации по Википедии указано, что 3.4028234663852885981170418348451e+38
является наибольшим числом, которое может быть представлено в неподвижной точке IEEE-754.
Это число, хранящееся в регистре с плавающей запятой = 0 11111111 11111111111111111111111
, и оно просто не отображается неправильно?
Если я пишу printf(TEXT, "Float %.38f", FLT_MAX);
, я получаю тот же ответ. Возможно, компьютер, который я использую, не использует IEEE-754?
Я понимаю ошибки с расчетами, но я не понимаю, почему число 340282346638528860000000000000000000000.0
является самым большим числом с плавающей запятой, которое может быть точно представлено.
Возможно, показатель Mantissa * Expoment вызывает ошибки расчета? Если это так, то 340282346638528860000000000000000000000.0
будет самым большим числом, которое может быть точно представлено без ошибок расчета. Думаю, это имело бы смысл. Просто нужно благословение.
Спасибо,
"0 11111111 11111111111111111111111" является NAN. Подозреваю, что вы хотите «0 11111110 11111111111111111111111» – chux
'FLT_MAX' - это то, что вы думаете. Ваш 'printf()' показывает его приближение. Чтобы узнать, что _exactly_ является десятичным значением 'FLT_MAX', вам нужно использовать другой код. – chux
Википедия также говорит: «Это дает от 6 до 9 достоверных цифр десятичной цифры», поэтому в повседневном использовании в качестве приближения некоторого близкого значения, пытаясь напечатать все цифры, как если бы это было определенное целое число с такой величиной, было немного глупо. Ни один из предыдущих 10^~ 30 целых чисел не был представлен. Интересно, однако, что printf показывает количество цифр, которые обычно имеют смысл в значении с двойной точностью - моя догадка заключается в том, что ваша реализация заставляет float удваивать, генерирует разумное представление этого и прокладки с 0s до требуемой длины , –