Арифметика с плавающей точкой не является точной.По мере увеличения числа точность младших цифр уменьшается.
0x4f56aa5d4b2d8a80 - очень большое число.
Что происходит в
new_length = length + 119.000000;
Это length + 119.000000
получает удвоение, чтобы сделать дополнение.Этот двойной округляется, довольно резко, потому что он такой большой.Затем он снова приводится к целочисленному типу uint64_t, когда ему присваивается значение new_length
.
Когда вы звоните
new_length = length + 238.000000;
Бывает, что округленный результат заканчивается тем же.
Что вы действительно хотите сделать, это
new_length = length + (uint64_t)238.0;
Это даст вам ответ, который вы хотите.Первоначально он будет приведен к двойному типу, который будет добавлен точно.