почемудвойной точности в C
printf("is 0.5 <= 0.49999999999999999 ? %s", 0.5 <= 0.49999999999999999 ? "true":"false");
возврат товара
is 0.5 <= 0.49999999999999999 ? true
* это не домашнее задание, просто любопытно.
почемудвойной точности в C
printf("is 0.5 <= 0.49999999999999999 ? %s", 0.5 <= 0.49999999999999999 ? "true":"false");
возврат товара
is 0.5 <= 0.49999999999999999 ? true
* это не домашнее задание, просто любопытно.
Лучший способ ответить на ваш вопрос, это слегка изменив строку кода:
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, не являются (в шестнадцатеричном порядке цифры повторяются и используют все значения). Короче говоря, использование шестнадцатеричного для ввода и печати чисел с плавающей запятой мгновенно сделает вас профессионалом.
Потому что '0.4999999999999999999' не может быть представлен в' double'. –
Ну, это должен быть вопрос домашней работы. По крайней мере, это было, когда я учился в школе. –
Возможно, вас заинтересует [этот вопрос] (http://stackoverflow.com/q/16831464/315052). – jxh