我在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'.
思想?
答案 0 :(得分:4)
@BasSwinckels正确地指出了一个问题。我会解决另一个问题。
第一个不可精确表示的双精度浮点整数是2^53+1
。将表达式传递给uint64
函数时,在转换为uint64之前,它们将被计算为双精度数。如果这些表达式求值为不能完全表示的双精度整数,您将看到如您所述的行为。这正是uint64(2^63-1)
和uint64(2^63)
都返回9223372036854775808
的原因。所有2的幂都可以安全地以双精度表示,因此uint64(2^63)-1
或uint64(2^63)-uint64(1)
是您应该使用的(一旦您弄清楚其他问题)。
答案 1 :(得分:3)
我没有看到您报告的问题。在我的电脑上(64位Ubuntu12.04上的Matlab R2012b):
>> mask_fraction = uint64(9223372036854775807)
mask_fraction =
9223372036854775807
>> uint64(2^63) - 1
ans =
9223372036854775807
您是否可以运行较旧的Matlab版本?
我还发现'未定义的函数或方法减去...'错误有点可疑。你有其他功能的uint64别名吗?首先尝试clear uint64
...
答案 2 :(得分:1)
从其他评论看来,Matlab在某些旧版本中没有为类uint64实现minus
方法。以下丑陋的解决方法适用于R2011b:
>> bitset(intmax('uint64'), 64, 0)
ans =
9223372036854775807
答案 3 :(得分:1)
我不知道你使用的MATLAB版本是否支持它,但这可能会有所帮助
mask_fraction = uint64(intmax('int64'))
返回
mask_fraction =
9223372036854775807
2^63-1
是int64
的最大值。