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
上面的问题不像是显示精度的问题。 1# lin2009
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)); 如果确信存在可证实的bug,不妨向http://www.mapleprimes.com/提出,看看那里怎样答复。 应该是Pi取的有效位数不同造成的。
>> 0.1e8*3118/3.141592654
ans = 9924902249.1467
>> 0.1e8*3118/3.14159265358979
ans =9924902251.106 同意messenger版主,如果Pi换成e或任意一个无理数、超越数也有这种情况出现。
evalf(3118/sqrt(2));
2204.758943
evalf(3118/sqrt(2));
2204.7589437397 用卡西欧(casio fx-82TL)的计算器算,得出的结果如下:
3118/pi = 992.4902251
用Windows自带的计算器(程序/附件中)计算:
3118/pi = 992.4902251(21059313854759148391)
用Maple算,在默认的环境下(未改变任何环境变量值)
得到的却是不同的值
evalf(3118/Pi);
992.4902249
就是这个看似不起眼的误差,给我最后的结果带来很大的(累积)误差。
“应该是Pi取的有效位数不同造成的。”
个人觉得这个取舍的策略很有问题。因为大部分都是在默认环境的情况下计算的,
不会想到这还出现误差(某种意义上也可以说是错误,按四舍五入应该是992.4902251)。
对于maple计算精度应该要比普通计算器或者普通的计算软件要高。 你的这种算法是不严谨的。
我的意思是你不要用机器中自带的pi常数来计算,而是直接输入3.141592654和3.14159265358979,因为你不知道机器中自带的pi常数的精度。
用Windows自带的计算器计算0.1e8*3118/3.141592654,取前10位也是992.4902249。
在maple默认的10位精度来计算这个算式,就应该得这个数,得别的反倒是不对了。
这与maple计算精度是否应该要比普通计算器或者普通的计算软件要高无关,如果你需要高精度可以调呀。
建议你好好体会一下maple的运算规则。
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]