Почему проблемы точности в числе с плавающей запятой варьируются в зависимости от значений?
Мне было интересно, почему проблемы точности в числах с плавающей запятой различаются при разных значениях:
#include <iostream>
#include <iomanip>
int main ()
{
std::cout << std::setprecision(20);
double d1(1.0);
std::cout << d1 << std::endl;
double d2(0.1);
std::cout << d2 << std::endl;
return 0;
}
Выход этой программы:
- 1
- +0,10000000000000000555
Если оба числа относятся к типу double (которые обычно имеют проблемы с точностью), почему компилятор не находит проблем со значением 1.0 и обнаруживает проблему со значением 0.1. Еще одна вещь, которая мне не понятна, это то, что, если точность установлена на 20 цифр, почему я получаю число, которое содержит 21 цифру в результате d2?
1 ответ
Решение
Ваш компьютер использует представление с плавающей запятой, в котором 1.0
может храниться точно, но 0.1
не может. Это, вероятно, IEC 60559.
Ведущие нули не считаются частью точности (они просто заполнители); ваш вывод на самом деле имеет 20 цифр, не считая 0.
на старте.