摘要 探讨表达式 “((1/3-0.3333333333333333235)+(1/3-0.333333333333333759)*0.008)*10^20” 的计算精度问题。
对于下列算式
若用C++编程计算,则输出是错误结果[1]。那么别的语言呢?
例1. 计算
不妨用Java代码计算:
public class expression{
public static void main(String[] args) {
double a = 0.3333333333333333235, b = 0.333333333333333759, c = 0.008, d = 1e20;
double result = (((double)1.0/(double)3 - a) + ((double)1.0/(double)3 - b) * c) * d ;
System.out.println(result);
}
}
则运行后输出为负数:-355.2713678800501 .
若用Go语言编码:
package main
import (
"fmt"
)
func main() {
a := 0.3333333333333333235; b := 0.333333333333333759; c := 0.008; d := 1e20
result := ((1.0/3 - a) + (1.0/3 - b) * c) * d
fmt.Printf("%v", result)
}
则运行后输出完全相同:-355.2713678800501 .
然而,准确结果是正数 642.8 . 二者均是错误结果。
参考文献
[1] 赵世忠. 算术表达式的一种可信计算算法及其软件ISReal. 中国科学F辑: 信息科学, 2016, 46(6): 698-713