Мне было интересно, почему проблемы точности в числах с плавающей запятой различаются при разных значениях:
#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;
}
Выход этой программы:
Если оба числа имеют тип double (что обычно имеет проблемы с точностью), то почему компилятор не находит проблем со значением 1.0 и обнаруживает проблему со значением 0.1. Еще одна вещь, которая мне не понятна, это то, что, если точность установлена на 20 цифр, почему я получаю число, которое содержит 21 цифру в результате d2?
Ваш компьютер использует представление с плавающей запятой, в котором 1.0
может храниться точно, но 0.1
не может. Это наверное IEC 60559.
Ведущие нули не считаются частью точности (они просто заполнители); ваш вывод на самом деле имеет 20 цифр, не считая 0.
на старте.