мне было интересно, почему точность проблемы чисел с плавающей запятой отличаются с различными значениями:Почему точность задач в числе с плавающей запятой зависит от значений?
#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;
}
Вывод этой программы является:
- 0,10000000000000000555
Если оба числа имеют тип double (что обычно имеет проблемы с точностью), почему компилятор не обнаруживает проблем со значением 1. 0 и найти проблему со значением 0,1. Еще одна вещь, которая мне не понятна, заключается в том, что если точность установлена на 20 цифр, почему я получаю число, которое содержит 21 цифру в результате d2?
Некоторые цифры могут быть выражены точно в бинарном формате с плавающей запятой, другие числа могут быть приблизительными. Прочитайте [запись в Википедии] (https://en.wikipedia.org/wiki/Floating_point), чтобы увидеть, как все работает под капотом. – Evert
Однако, когда вы видите '1', и это двойной или плавающий, никогда не предполагайте, что это точно * 1; всегда используют логику с плавающей запятой, когда, например, сравнения. – Evert
@Evert: Вам удалось выбрать одно из двух исключений. _Exactly_ 1.0 и _exactly_ 0.0 показывают необычно часто. – MSalters