Это дает «неправильный» ответ просто потому, что не все реальные значения представляются числами с плавающей точкой (или удваиваются, в этом отношении). То, что вы получите, является приближением, основанным на базовой кодировке.
Для представления каждого действительного значения, даже между 1,0x10 -100 и 1,1x10 -100 (поистине крошечный диапазон), вам по-прежнему требуется бесконечное количество битов.
Значения IEEE754 одинарной точности имеют только 32 бита (некоторые из которых предназначены для других задач, таких как представления экспоненты и NaN / Inf) и поэтому не могут дать вам бесконечную точность. На самом деле у них есть 23 бита, что дает точность около 2 24 (есть дополнительный неявный бит) или чуть более 7 десятичных цифр (log 10 (2 24 ) примерно 7,2).
Я заключаю слово "неправильно" в кавычки, потому что это не на самом деле неправильно. Что плохого в том, что вы понимаете, как компьютеры представляют цифры (не обижайтесь, вы не одиноки в этом заблуждении).
Перейдите на http://www.h -schmidt.net / FloatApplet / IEEE754.html и введите свой номер в поле «Десятичное представление», чтобы увидеть это в действии.
Если вам нужно более точное число, используйте двойные числа вместо чисел с плавающей запятой - они имеют удвоенное количество битов, доступных для представления значений (при условии, что ваша реализация C использует типы данных IEEE754 одинарной и двойной точности для чисел с плавающей запятой и двойной соответственно). 1026 *
Если вам нужна произвольная точность, вам нужно использовать библиотеку "bignum", такую как GMP , хотя это несколько медленнее, чем у нативных типов, поэтому убедитесь, что вы понимаете компромисс.