Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Floating point 指定浮点类型是否足以保证相同的结果?_Floating Point_Precision - Fatal编程技术网

Floating point 指定浮点类型是否足以保证相同的结果?

Floating point 指定浮点类型是否足以保证相同的结果?,floating-point,precision,Floating Point,Precision,我正在写一个规范,描述一些将由软件执行的算法。我的意图是,我可以将这个规范交给两个不同的程序员(他们使用可能不同的语言和/或体系结构),当我向他们的程序提供一些输入时,他们总是会给出相同的结果 例如,如果规范中说“向结果中添加0.5”,这可能是一个问题。根据浮点存储方法,0.5可以表示为0.49999135或0.500000138等 在这里指定规则的最佳方式是什么,以使事情在各方面保持一致?我可以说“所有数字都必须以64位格式表示”吗?或者说“所有数字必须先按1000进行缩放,然后使用定点运算”

我正在写一个规范,描述一些将由软件执行的算法。我的意图是,我可以将这个规范交给两个不同的程序员(他们使用可能不同的语言和/或体系结构),当我向他们的程序提供一些输入时,他们总是会给出相同的结果

例如,如果规范中说“向结果中添加0.5”,这可能是一个问题。根据浮点存储方法,0.5可以表示为0.49999135或0.500000138等

在这里指定规则的最佳方式是什么,以使事情在各方面保持一致?我可以说“所有数字都必须以64位格式表示”吗?或者说“所有数字必须先按1000进行缩放,然后使用定点运算”这样的说法更好吗


这与我遇到的大多数浮点问题略有不同,因为问题是跨平台的可重复性,而不是整体精度。

IEEE 754-2008第11条描述了可重复浮点结果的必要条件。这主要是:

  • 从编程语言到IEEE 754操作的绑定(例如,
    a*b
    执行IEEE 754指定的浮点乘法)
  • 指定需要可再现结果的方法。例如,禁用默认语言权限以使用比标称对象类型更宽的精度
  • 与外部十进制字符序列之间的精确转换
  • 避免了IEEE 754的一些更奇特的功能
今天的编译器对这些需求的支持很差

添加.5不会是问题。所有普通的浮点实现都精确地表示.5,并正确地添加它。问题是,一个语言实现可能会添加.5并精确地保留结果(比通常的
double
更精确),而另一个实现会将结果取整为
double
。如果使用数学库例程(例如
cos
log
),这是另一个问题,因为它们很难计算好,不同的实现提供不同的近似值


IEEE 754是一个很好的规范。理想情况下,您应该指定规范的实现符合IEEE 754。

IEEE 754-2008第11条描述了可复制浮点结果所需的内容。这主要是:

  • 从编程语言到IEEE 754操作的绑定(例如,
    a*b
    执行IEEE 754指定的浮点乘法)
  • 指定需要可再现结果的方法。例如,禁用默认语言权限以使用比标称对象类型更宽的精度
  • 与外部十进制字符序列之间的精确转换
  • 避免了IEEE 754的一些更奇特的功能
今天的编译器对这些需求的支持很差

添加.5不会是问题。所有普通的浮点实现都精确地表示.5,并正确地添加它。问题是,一个语言实现可能会添加.5并精确地保留结果(比通常的
double
更精确),而另一个实现会将结果取整为
double
。如果使用数学库例程(例如
cos
log
),这是另一个问题,因为它们很难计算好,不同的实现提供不同的近似值


IEEE 754是一个很好的规范。理想情况下,您应该指定规范的实现符合IEEE 754。

可能的重复可能的重复有趣的是,大多数CPU和编程语言都声称符合IEEE 754。然而,它们都可以使用不同的规则进行中间计算和四舍五入。那些依赖浮点决定论的人必须跳出各种圈套来遵守这些规则。听起来很痛苦。@Tim最后一个没有提供“IEEE 754合规性”所需一切的通用桌面处理器一定是在2003-2004年左右制造的()。错误完全在于编译链。作者自己可能会将责任归咎于用户对结果再现性(相对于性能)、与旧ABI的兼容性、生成代码与2003年前处理器的兼容性等方面的兴趣相对不足……有趣的是,大多数CPU和编程语言都声称符合IEEE 754。然而,它们都可以使用不同的规则进行中间计算和四舍五入。那些依赖浮点决定论的人必须跳出各种圈套来遵守这些规则。听起来很痛苦。@Tim最后一个没有提供“IEEE 754合规性”所需一切的通用桌面处理器一定是在2003-2004年左右制造的()。错误完全在于编译链。这些研究的作者自己可能将责任归咎于用户对结果再现性(而非性能)、与旧ABI的兼容性、生成代码与2003年前处理器的兼容性等方面的兴趣相对不足…