Почему проблемы точности в числе с плавающей запятой варьируются в зависимости от значений?

Мне было интересно, почему проблемы точности в числах с плавающей запятой различаются при разных значениях:

#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. 1
  2. +0,10000000000000000555

Если оба числа относятся к типу double (которые обычно имеют проблемы с точностью), почему компилятор не находит проблем со значением 1.0 и обнаруживает проблему со значением 0.1. Еще одна вещь, которая мне не понятна, это то, что, если точность установлена ​​на 20 цифр, почему я получаю число, которое содержит 21 цифру в результате d2?

1 ответ

Решение

Ваш компьютер использует представление с плавающей запятой, в котором 1.0 может храниться точно, но 0.1 не может. Это, вероятно, IEC 60559.

Ведущие нули не считаются частью точности (они просто заполнители); ваш вывод на самом деле имеет 20 цифр, не считая 0. на старте.

Другие вопросы по тегам