lin2009 发表于 2011-3-21 21:11:39

maple14.01数值计算中的Bug?

> evalf(3118/Pi);
                        992.4902249
> evalf(3118/Pi);
                        992.490225121060
> floor(0.1e8*evalf(3118/Pi));
                           9924902251
> floor(0.1e8*evalf(3118/Pi));
                           9924902249

上面的问题不像是显示精度的问题。

maplelab 发表于 2011-3-21 21:58:04

1# lin2009

lin2009 发表于 2011-3-22 11:47:40

2# maplelab
感觉版主不知不觉中偷换了概念。
maple的默认数字位Digitals是小于15位的。

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

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

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

maplelab 发表于 2011-3-22 17:17:58

如果确信存在可证实的bug,不妨向http://www.mapleprimes.com/提出,看看那里怎样答复。

messenger 发表于 2011-3-22 23:36:54

应该是Pi取的有效位数不同造成的。
>> 0.1e8*3118/3.141592654
ans = 9924902249.1467
>> 0.1e8*3118/3.14159265358979
ans =9924902251.106

gfl 发表于 2011-3-23 00:09:45

同意messenger版主,如果Pi换成e或任意一个无理数、超越数也有这种情况出现。
evalf(3118/sqrt(2));
                           2204.758943
evalf(3118/sqrt(2));
                           2204.7589437397

lin2009 发表于 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计算精度应该要比普通计算器或者普通的计算软件要高。

messenger 发表于 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的运算规则。

lin2009 发表于 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将它截断而已。
页: [1]
查看完整版本: maple14.01数值计算中的Bug?