首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >双倍数学运算的结果是否完全可重复?

问双倍数学运算的结果是否完全可重复?
EN

Stack Overflow用户
提问于 2017-02-23 22:53:03
回答 4查看 754关注 0票数 4

我有一个使用Java 8和Double作为数据类型的复杂数据处理算法。给定相同的输入(几十万个数据库行),该算法输出不同的双值。有时返回value a,有时值b。这两个值在每次执行时交替进行。a与b的差值为0.0001。我知道双数据类型不会像Decimal那样授予确切的值。但是,我不确定它是否提供了可重复的结果,假设输入完全相同。也就是说,是否有可能以不一致的方式应用四舍五入的政策?我在这里的目的是解释为什么用相同的输入得到不同的值。

其他细节:我正在使用Tomcat 8运行时环境,在SAP上完成部署。数据库级别的数据类型是十进制的,由于历史原因,我们需要在Java级别加倍。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-02-23 22:58:52

秩序很重要。如果每次处理的数据库行的顺序不一样,则会产生不同的结果。下面是一个简单的例子:

代码语言:javascript
复制
double d1 = 0.1;
double d2 = 0.2;
System.out.println(d1 + d1 + d2 + d2); 
System.out.println(d1 + d2 + d2 + d1); 
票数 8
EN

Stack Overflow用户

发布于 2017-02-23 22:57:30

给定相同的输入,浮点数计算(在同一个平台上)将产生相同的输出。

但是,如果以不同的顺序输入输入数字,则可能得到不同的结果(尽管这在数学上不会产生任何差别)。也许这就是这里所发生的事情(看到您从关系数据库中提取数字,除非显式排序,否则关系数据库没有定义的顺序)。如果您使用多个CPU进行并行计算,并且每次对数据进行不同的划分和组合,也会发生同样的情况。

票数 9
EN

Stack Overflow用户

发布于 2017-02-23 23:02:17

对于strictfp,Java语言规范完全定义了所有简单算法的结果,无论是在哪个平台上。

有些java.lang.Math方法可以为某些操作产生稍微不同的结果。如果您需要可重复的结果,请使用java.lang.StrictMath代替。

正如在下面的注释中所指出的,java.lang.Math.cos是一个函数的示例,其结果可以更改。API文档说:“计算结果必须在精确结果的1 ulp以内,结果必须是半单调的。”

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42427719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档