2015-07-15 11 views
0

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

#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

Некоторые цифры могут быть выражены точно в бинарном формате с плавающей запятой, другие числа могут быть приблизительными. Прочитайте [запись в Википедии] (https://en.wikipedia.org/wiki/Floating_point), чтобы увидеть, как все работает под капотом. – Evert

+0

Однако, когда вы видите '1', и это двойной или плавающий, никогда не предполагайте, что это точно * 1; всегда используют логику с плавающей запятой, когда, например, сравнения. – Evert

+0

@Evert: Вам удалось выбрать одно из двух исключений. _Exactly_ 1.0 и _exactly_ 0.0 показывают необычно часто. – MSalters

ответ

3

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

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