MAXScript: записать числа в файл с полной точностью?
Я ищу способ сделать 3ds Max для записи значений в файл в их полной точности?
Я понимаю, что Макс использует 32-битные числа с плавающей точкой во своих внутренних представлениях, но значения, которые он выводит в файлы, как правило, имеют немного меньшую точность.
Единственная функция, которая может записывать значения в файл, это format "%" value to: f
эта функция выводит значения, которые выглядят как 0.48729
Я использую этот конвертер, чтобы проверить представление числа с плавающей запятой и увидеть, что в шестнадцатеричном виде это 0x3ef97e13
если я попытаюсь поиграть с его младшими значащими цифрами, я могу получить0.487291 = 0x3ef97e35
0.487292 = 0x3ef97e56
0.487293 = 0x3ef97e78
ясно, что даже 32-битное число, которое держит Макс, имеет большую точность, чем то, что он выводит с помощью этой функции.
Единственная ссылка, которую я нашел для большей точности, это использовать formattedprint
но эта функция, кажется, не в состоянии записать в файл.
Есть ли другой путь?
2 ответа
Накормите выход formattedPrint
в format
или же print
(в зависимости от вашего варианта использования).
Другой вариант, если вы хотите гарантировать безошибочную точность без длинных строк, это сохранить двоичное представление числа в соответствии с онлайн-преобразованием, на которое вы ссылались. Это возможно с помощью MaxScript bit.floatAsInt
а также bit.intAsFloat
,
Всякий раз, когда вы пишете значение с плавающей точкой, переинтерпретируйте биты из float->int. Всякий раз, когда вы читаете одно и то же значение, переинтерпретируйте биты из int->float. Вот пример:
d = 1.0 / 3.0
w = bit.floatAsInt d -- when writing to disk
r = bit.intAsFloat w -- when reading from disk
d==r -- verify as identical
В противном случае вам понадобится около 30 знаков после запятой через formattedPrint d format:".30f"