黄翔 发表于 2023-6-6 10:22:51

rtos有bug?

   (rtos 1.012345678901234567890123456789 2 14)
   ==>"1.012345678901234"

   (rtos 1.012345678901234567890123456789 2 15)
   ==>"1.012345678901235":L这个为什么不一样??

   (rtos 1.012345678901234567890123456789 2 16)
   ==>"1.012345678901234"

   (rtos 1.012345678901234567890123456789 2 30)
   ==>"1.012345678901234"


1291500406 发表于 2023-6-6 11:04:59

本帖最后由 1291500406 于 2023-6-6 11:06 编辑

命令: (rtos 1.012345678901234567890123456789 2 15)
"1.012345678901235"
命令: (rtos 1.012345678901234567890123456789 2 14)
"1.01234567890124"
命令: (rtos 1.012345678901234567890123456789 2 16)
"1.012345678901234"
命令: (rtos 1.012345678901234567890123456789 2 30)
"1.012345678901234"

baitang36 发表于 2023-6-6 11:20:49

浮点数的精度问题

橡皮 发表于 2023-6-6 15:41:44

baitang36 发表于 2023-6-6 11:20
浮点数的精度问题

这个正常啊,最后一位都是不可信的

tryhi 发表于 2023-6-6 16:41:09

本帖最后由 tryhi 于 2023-6-6 16:51 编辑

1.012345678901234567890123456789
其实这个数只存在于源码中,实际CAD内存里面保存不了这么长的数。
不是BUG,而是双精度浮点数的特性,为什么取15比取16大,我猜测是因为15刚刚处于最后一位跟半位之间,其半位取整后为5,此时15进位,而16退位是因为不取整小于5,所以16退位,这里要用小数二进制的转换方式去思考。

在二进制中,像0.05这样的小数无法精确表示为有限位数的二进制。类似于0.4,0.05也是一个无限循环的二进制小数。
当我们试图将0.05转换为二进制时,我们会得到以下表示:
0.05(十进制)= 0.000011000010111...(二进制)
在这个二进制表示中,数字序列 "000011000010111" 会一直重复下去。因此,0.05无法以有限位数的二进制精确表示。
在计算机中,0.05通常会近似表示为一个接近0.05的二进制近似值,而不是精确值。这是因为浮点数的表示有限,无法精确表示所有的小数。


同样的情况可以引申到浮点数计算误差的问题http://bbs.mjtd.com/thread-170066-1-1.html

liweihua-1984 发表于 2023-6-6 17:11:45

本帖最后由 liweihua-1984 于 2023-6-6 17:13 编辑

奇进偶不进
页: [1]
查看完整版本: rtos有bug?