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

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

#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?

0

Решение

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

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

3

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector