static_cast<int>(abs(13200 / 1.1)) = 11999

76
11 ноября 2021, 07:40

Вопрос в том почему

static_cast<int>(abs(13200 / 1.1)) = 11999

а

static_cast<int>(abs(12000.)) = 12000
Answer 1

Потому что на самом деле это число - 11999.99999999999818...

Добро пожаловать в мир вычислений с плавающей точкой! :)

Здесь нет точного представления, здесь любое число - просто сумма степеней 2 - типа, 2 + 1/2 + 1/16 +...

Answer 2

Беда в том, что знаменатель 1.1 не может быть представлен в формате IEEE-754 точно, он будет округлён к ближайшему значению, равному 1.100000000000000088817841970012523233890533447265625 (0x3ff199999999999a), которое чуть-чуть больше. По этой причине после деления получится число чуть чуть меньше 12'000, и вы берёте от него целую часть, получаете 11'999

И хотя я согласен, что это очень тупо, когда константы на этапе компиляции вычисляются не точно, всё-таки придётся пока что с этим жить. Таково наследие сурового прошлого в программировании.

READ ALSO
Как из uint8 сделать QIcon?

Как из uint8 сделать QIcon?

У меня есть переменная типа uint8*, которая "заполнена" картинкойКак преобразовать её в QIcon? А вот функция, которая заполняет переменную типа...

195
Как такое реализуется

Как такое реализуется

Нужна помощь или совет как реализовать такую задачу:Надо отсортировать массив и вывести все этапы сортировкиМассивы я отсортировал и программа...

112
Каково состояние объектов стандартной библиотеки после перемещения?

Каково состояние объектов стандартной библиотеки после перемещения?

Скажите, пожалуйста, в каком состоянии находятся объекты стандартной библиотеки после перемещения? Можно ли продолжать их использовать?

79
Как найти площадь прямоугольника или помогите найти ошибку в коде [закрыт]

Как найти площадь прямоугольника или помогите найти ошибку в коде [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском

192