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"

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