Чтобы понять, что происходит не так, вам нужно прочитать стандарт IEEE по с плавающей запятой
Давайте рассмотрим структуру числа с плавающей запятой на секунду:
Число с плавающей запятой разбито на две части (хорошо 3, но игнорируйте бит знака в течение секунды).
У вас есть показатель и мантисса. Вот так:
smmmmmmmmeeeeeee
Примечание: это не точное количество битов, но дает общее представление о том, что происходит.
Чтобы выяснить, какое у вас число, мы сделаем следующий расчет:
mmmmmm * 2^(eeeeee) * (-1)^s
Так что же такое float.MaxValue? Ну, у вас будет максимально возможная мантисса и максимально возможный показатель. Давайте представим, что это выглядит примерно так:
01111111111111111
на самом деле мы определяем NAN и + -INF и пару других соглашений, но игнорируем их на секунду, потому что они не имеют отношения к вашему вопросу.
Итак, что происходит, когда у вас есть 9.9999*2^99 + 1
? Ну, вам не хватает значащих цифр для добавления 1. В результате оно округляется до того же числа. В случае единой точности с плавающей запятой точка, в которой +1
начинает округляться, оказывается 16777216.0