在使用matlab的符号工具箱
时,我偶然发现了以下奇怪的事情/>> syms e
/>> Y = 11111111111111111 ^ E
y = 11111111111111112 ^ E
似乎在使用大数字时存在限制。这可以解决而不需要改变一个完全不同的系统,如圣人?
答案 0 :(得分:2)
我认为问题在于Matlab在将数字转换为double之前将其解析为double 象征性的表达。由于double有一个52位的尾数,你有大约16位有效数字,但你的数字更长。
作为替代方案,您可以尝试直接从字符串创建数字:
y=sym('11111111111111111')^e
不幸的是,我现在没有Matlab,所以这个答案是未经测试的。
答案 1 :(得分:2)
这不是一个错误,它是一个功能。它被称为“四舍五入错误”
matlab使用双格式存储普通变量,就像C编程语言中的double和许多其他语言一样,如C ++。
实际上,“bug”与“^ x”无关,我们可以看到:
>> clear
>> syms y
>> format bank
>> y=11111111111111111
y =
11111111111111112.00
即使是简单的分配也会触发“错误”。
我们可以使用调试模式看到双变量如何真正存储在VS的内存中:
正如您在屏幕截图中看到的那样,a和b都在内存中存储为“2ea37c58cccccccc”,这意味着计算机无法区分对方。
这就是你找到“虫子”的原因。
为避免这种情况,您可以改为使用符号常量:
>> y=sym('11111111111111111')
y =
11111111111111111
这样,计算机将以不同的格式将“y”存储在内存中,这样可以避免舍入错误并节省更多内存。