Почему приведение типа double к int похоже на округление после 16-й цифры? - PullRequest
0 голосов
/ 23 октября 2018
//g++  5.4.0

#include <iostream>

int main()
{
    std::cout << "Hello, world!\n";
    std::cout << (int)0.9999999999999999 << std::endl; // 16 digits after decimal
    std::cout << (int)0.99999999999999999 << std::endl; // 17 digits after decimal
}

Вывод:

Hello, world!
0
1

Почему это происходит?

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Наиболее точное представление 0.99999999999999999 равно 1.0. 1) Наиболее точное представление 0.9999999999999999: 0.999999999999999888977697537484.

1) В 64-битном представлении с плавающей точкой IEEE754 с двойной точностью.

Поскольку округления, кроме усечения, нет, каждый дает 1 а другой дает 0 при преобразовании в целочисленный тип.

0 голосов
/ 23 октября 2018

Наиболее точное представление с плавающей запятой значения 0.99999999999999999 (17 цифр после десятичной дроби) в точности равно 1.0.

Наиболее точное представление с плавающей запятой значения 0.9999999999999999 (16 цифр после десятичной запятой) меньше1.0.

Преобразование в int усекает одно до 0, а другое до 1.

...