Строка неправильно преобразована в число с плавающей точкой? (Blitzmax - Размышления)

У меня есть небольшая проблема в Blitzmax. Я пытаюсь прочитать INI-файл, и если я читаю числа с плавающей точкой, они конвертируются очень странным образом. Соответствующая строка в файле выглядит так, например:

_fStrength=40.6

Вывод этого выглядит так:

DebugLog:_fStrength: 40.5999985

Код, который я использую для чтения, работает с отражением и выглядит так:

For Local fld:TField = EachIn id.EnumFields()
            fld.Set(obj, SearchInFile("TempWeapon" + index, fld.Name(), "Weapons.ini"))
            DebugLog(fld.Name() + ": " + String(fld.Get(obj)))
        Next

Я узнал, что это происходит только в том случае, если число после "." не равно 5 или 0. Я не могу объяснить это поведение, потому что, если я не использую отражения, он работает нормально.

Может ли кто-нибудь помочь мне, пожалуйста?

1 ответ

Решение

Как вы, вероятно, знаете, ваш компьютер хранит числа в двоичном коде, используя ограниченный размер. 40.6 в двоичном виде это периодическая последовательность (101000.1001100110011001100...(бесконечно), аналогично тому, что происходит, когда вы пытаетесь записать цифры 1/3) повторяется и, таким образом, не может быть представлен точно, поэтому вы получаете ошибки округления.

Число правильных цифр, которое вы здесь получаете, выглядит так, как будто вы используете числа с плавающей запятой одинарной точности, вы можете отодвинуть ошибку дальше, удвоив ее, но она не исчезнет.

Для справки, вы можете найти Wikipedia по плавающей запятой полезной.

Другие вопросы по тегам