我在使用 MATLAB 和 64 位整数时遇到了一些问题。我想要一个等于 2^63-1 的掩码(除 MSB 之外的所有掩码),但 MATLAB 似乎只是舍入了所有内容。
>> mask_fraction = uint64(9223372036854775807)
mask_fraction = 9223372036854775808 % This is 2^63 again, not 2^63-1!
同样,
>> uint64(2^63)
ans = 9223372036854775808
>> uint64(2^63-1)
ans = 9223372036854775808
我的另一个尝试根本行不通:
>> uint64(2^63) - 1
??? Undefined function or method 'minus' for input arguments of type 'uint64'.
想法?
最佳答案
@BasSwinckels 正确地指出了一个问题。我会解决另一个问题。
第一个不能精确表示的 double 浮点整数是2^53+1
。当您将表达式传递给 uint64
函数时,它们在转换为 uint64 之前被评估为 double 值。如果这些表达式的计算结果为不能精确表示的 double 整数,您将看到您所描述的行为。这正是 uint64(2^63-1)
和 uint64(2^63)
都返回 9223372036854775808
的原因。 2 的所有幂都可以用 double 安全地表示,所以 uint64(2^63)-1
或 uint64(2^63)-uint64(1)
是你的应该使用(一旦你弄清楚你的其他问题)。
关于Matlab:如何正确获得相当于 2^63-1 的掩码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18046989/