Unexplained warning creating vectors
下面是我创建两个向量时从我的终端打印出来的。有谁知道第二次调用 one() 发出警告而第一次没有发出警告的原因?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| |
- 相关问题:关于浮点精度:为什么迭代次数不相等? (也请查看链接的问题)
是的,您可能认为 100*.3 是一个整数,但事实并非如此。这是因为 0.3 在所使用的 IEEE 数字表示中并未存储为精确的 0.3。大多数这样的十进制数字都没有精确表示。请记住,数字以二进制形式存储。在 matlab 中输入 0.3 时存储的真正十进制表示是:
0.299999999999999988897769753748434595763683319091796875
接近于 0.3,但并非完全如此。
http://www.mit.edu/~pwb/cssm/matlab-faq_toc.html
http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html
有时结果会是一个精确的整数。
- 很抱歉恢复这么旧的帖子,但我怎样才能看到存储在内存中的任何内容的精确十进制表示为 0.3?您是自己计算的还是在 Matlab 中有一种方法可以将其显示到这种精度级别?
-
@user13267 - 我使用我的 HPF 工具。它在文件交换上。但是你可以只使用 sprintf。例如,试试这个: sprintf(\\'%0.55f\\',.3)
-
>> SPRINTF(\\'%)。
-
我得到了这些; 0.55的意义是什么?我们怎么知道放多少?我的 matlab 版本是 MATLAB 版本 7.9.0.529 (R2009b)
-
@user13267 - 它可能是您使用的 MATLAB 的半旧版本。它在 2012b 对我来说效果很好。 55 来自我的知识,即所有双精度数字在从 IEEE 二进制形式转换为十进制时都需要不超过 55 个非零数字。 (这来自于编写 HPF。)我认为您可以在该 MATLAB 版本中使用我的 HPF 工具,因为它不依赖于 sprintf 技巧。请注意,我并不是说双精度数的十进制数字超过 16 个左右是正确的,但是当您将二进制形式转换为十进制时,它总是在大约 55 个十进制数字后消失。
-
sprintf(\\'%0.55f\\',.3) ans = 0.2999999999999999888977697537484345957636833190917968750