2014-08-30 7 views
0

почемудвойной точности в C

printf("is 0.5 <= 0.49999999999999999 ? %s", 0.5 <= 0.49999999999999999 ? "true":"false"); 

возврат товара

is 0.5 <= 0.49999999999999999 ? true 

* это не домашнее задание, просто любопытно.

+0

Потому что '0.4999999999999999999' не может быть представлен в' double'. –

+1

Ну, это должен быть вопрос домашней работы. По крайней мере, это было, когда я учился в школе. –

+1

Возможно, вас заинтересует [этот вопрос] (http://stackoverflow.com/q/16831464/315052). – jxh

ответ

4

Лучший способ ответить на ваш вопрос, это слегка изменив строку кода:

printf("is %.16e <= %.16e ? %s", 0.5, 0.49999999999999999, 0.5 <= 0.49999999999999999 ? "true":"false"); 

Компиляция этой линии, вы увидите, что 0.49999999999999999 округляется до ближайшего представимому double, который является таким же, как для 0.5 (и действительно представляет точное значение 1/2). Это объясняет, почему один ниже или равен другому: они представляют собой две разные обозначения для одного и того же.


Примечание: Я выбрал формат %.16e, как этот формат имеет свойство никогда не печатать то же самое для чисел с плавающей запятой отличаются двойной точностью. Эксперты предпочитают использовать шестнадцатеричный формат %a. Не только шестнадцатеричный является более компактным, но с его помощью становится очевидным, что 0.5 представлен точно (это 0x0.8p0 или 0x1.0p-1), а некоторые другие десятичные числа, такие как 0,1, не являются (в шестнадцатеричном порядке цифры повторяются и используют все значения). Короче говоря, использование шестнадцатеричного для ввода и печати чисел с плавающей запятой мгновенно сделает вас профессионалом.

Смежные вопросы