找回密码
 注册
Simdroid-非首页
查看: 145|回复: 8

[2.数值] maple14.01数值计算中的Bug?

[复制链接]
发表于 2011-3-21 21:11:39 | 显示全部楼层 |阅读模式 来自 湖南湘潭
> evalf(3118/Pi);
                          992.4902249
> evalf[15](3118/Pi);
                        992.490225121060
> floor(0.1e8*evalf[15](3118/Pi));
                           9924902251
> floor(0.1e8*evalf(3118/Pi));
                           9924902249

上面的问题不像是显示精度的问题。
发表于 2011-3-21 21:58:04 | 显示全部楼层 来自 湖北武汉
Simdroid开发平台
1# lin2009

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复 不支持

使用道具 举报

 楼主| 发表于 2011-3-22 11:47:40 | 显示全部楼层 来自 湖南湘潭
2# maplelab
感觉版主不知不觉中偷换了概念。
maple的默认数字位Digitals是小于15位的。

Digitals := 15
修改了默认的环境参数。

这种情况下下面的语句是没有任何区别的。
> evalf(3118/Pi);
> evalf[15](3118/Pi);

> floor(0.1e8*evalf[15](3118/Pi));
> floor(0.1e8*evalf(3118/Pi));

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2011-3-22 17:17:58 | 显示全部楼层 来自 湖北武汉
如果确信存在可证实的bug,不妨向http://www.mapleprimes.com/提出,看看那里怎样答复。
回复 不支持

使用道具 举报

发表于 2011-3-22 23:36:54 | 显示全部楼层 来自 黑龙江牡丹江
应该是Pi取的有效位数不同造成的。
>> 0.1e8*3118/3.141592654
ans = 9924902249.1467
>> 0.1e8*3118/3.14159265358979
ans =9924902251.106
回复 不支持

使用道具 举报

发表于 2011-3-23 00:09:45 | 显示全部楼层 来自 上海
同意messenger版主,如果Pi换成e或任意一个无理数、超越数也有这种情况出现。
evalf(3118/sqrt(2));
                             2204.758943
evalf[14](3118/sqrt(2));
                             2204.7589437397
回复 不支持

使用道具 举报

 楼主| 发表于 2011-3-23 09:26:04 | 显示全部楼层 来自 湖南湘潭
用卡西欧(casio fx-82TL)的计算器算,得出的结果如下:
3118/pi = 992.4902251

用Windows自带的计算器(程序/附件中)计算:
3118/pi = 992.4902251(21059313854759148391)

用Maple算,在默认的环境下(未改变任何环境变量值)
得到的却是不同的值
evalf(3118/Pi);
                          992.4902249

就是这个看似不起眼的误差,给我最后的结果带来很大的(累积)误差。

“应该是Pi取的有效位数不同造成的。”
个人觉得这个取舍的策略很有问题。因为大部分都是在默认环境的情况下计算的,
不会想到这还出现误差(某种意义上也可以说是错误,按四舍五入应该是992.4902251)。
对于maple计算精度应该要比普通计算器或者普通的计算软件要高
回复 不支持

使用道具 举报

发表于 2011-3-23 17:58:59 | 显示全部楼层 来自 黑龙江哈尔滨
你的这种算法是不严谨的。

我的意思是你不要用机器中自带的pi常数来计算,而是直接输入3.141592654和3.14159265358979,因为你不知道机器中自带的pi常数的精度。

用Windows自带的计算器计算0.1e8*3118/3.141592654,取前10位也是992.4902249。

在maple默认的10位精度来计算这个算式,就应该得这个数,得别的反倒是不对了。

这与maple计算精度是否应该要比普通计算器或者普通的计算软件要高无关,如果你需要高精度可以调呀。

建议你好好体会一下maple的运算规则。

回复 不支持

使用道具 举报

 楼主| 发表于 2011-3-23 20:40:43 | 显示全部楼层 来自 湖南湘潭
8# messenger

版主不要激动,是我的说法不严谨,不是算法不严谨。

Digits是控制计算精度,而不是像Matlab等软件控制显示精度。
在发1#帖子时理解有些偏差。

Description
The Digits environment variable controls the number of digits that Maple uses when making calculations with software floating-point numbers.

个人觉得Maple默认的10位计算精度还不够,或者说默认10位可能不妥。某些情况在默认的情况下可能算得还不如用计算器算得准确。对于四大数学软件之一的maple当然要求要高一些。

算法没问题,至少目前看不出来问题。
若是用“直接输入3.141592654和3.14159265358979”的方法,那还不如将Digits设置得高些。如2#。
呵呵。。。

另外,“因为你不知道机器中自带的pi常数的精度”不知道怎么理解。
实际上Maple的计算精度可达268435448(与具体硬件环境有关)
> kernelopts(maxdigits);
                          268435448
也就是在通常的情况下,Pi可以有足够的精度满足计算要求,只不过Digits将它截断而已。
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-4-25 23:18 , Processed in 0.038062 second(s), 15 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表