MAXScript:将数字完全精确地写入文件?
MAXScript: write numbers to file in full precision?
我正在寻找一种方法让 3ds Max 以最精确的方式将值写入文件?
我意识到 Max 在其内部表示中使用 32 位浮点数,但它输出到文件的值通常似乎精度略低。
似乎能够将值写入文件的唯一函数是 format "%" value to: f
此函数输出的值看起来像 0.48729
我正在使用 this converter 来检查这个数字的浮点表示,并看到它在十六进制中是 0x3ef97e13
如果我尝试使用它的最低有效数字,我可以得到
0.487291 = 0x3ef97e35
0.487292 = 0x3ef97e56
0.487293 = 0x3ef97e78
很明显,即使 Max 持有的 32 位数字也比使用此函数输出的数字更准确。
我找到的唯一更准确的参考是使用 formattedprint
,但该函数似乎无法写入文件。
还有其他方法吗?
将 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"
我正在寻找一种方法让 3ds Max 以最精确的方式将值写入文件?
我意识到 Max 在其内部表示中使用 32 位浮点数,但它输出到文件的值通常似乎精度略低。
似乎能够将值写入文件的唯一函数是 format "%" value to: f
此函数输出的值看起来像 0.48729
我正在使用 this converter 来检查这个数字的浮点表示,并看到它在十六进制中是 0x3ef97e13
如果我尝试使用它的最低有效数字,我可以得到
0.487291 = 0x3ef97e35
0.487292 = 0x3ef97e56
0.487293 = 0x3ef97e78
很明显,即使 Max 持有的 32 位数字也比使用此函数输出的数字更准确。
我找到的唯一更准确的参考是使用 formattedprint
,但该函数似乎无法写入文件。
还有其他方法吗?
将 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"