【发布时间】:2016-09-07 07:46:50
【问题描述】:
单浮点运算(如 a+b、a-b、a*b 或 a/b)是否以更高的精度(80 位)计算并立即截断(到 32 位)总是产生与原始类型的计算相同的结果精度(32 位)?
或者结果中的最低有效位会有所不同吗?为什么?
编辑:来自this blog post的部分示例
float tmp; // 32 bit precision temporary variable
push a; // converts 32 to 64 bit
push b; // converts 32 to 64 bit
multiply; // 64 bit computation
pop tmp; // converts result to 32 bits
这个例子的作者是这样解释这段代码的:
即使乘法和加法指令使用 64 位内部精度,结果也会立即转换回 32 位格式,因此不会影响结果。
所以我要问的是,这总是正确的吗?像这样的单个操作,无论在什么平台上,总是会产生与最后一位相同的结果?
我正在使用 C# 进行编程,我们无法控制执行的精度浮点运算。
来自 C# 规范:
浮点运算的执行精度可能高于 操作的结果类型。例如,一些硬件 架构支持“扩展”或“长双精度”浮点 比双精度类型具有更大范围和精度的类型,并且 使用这个更高的隐式执行所有浮点运算 精度类型。
而且我需要知道浮点上的单个操作(如下面的 C# 示例)是否具有确定性。
double a = 2.5d;
double b = 0.1d;
myClassInstance.someDoubleField = a*b; // value should be converted out of extended precision
那么someDoubleField 值在所有平台上都相同吗?
【问题讨论】:
-
你的意思是“四舍五入”中的截断吗?或者您实际上是指通过“向最接近或什至”四舍五入来降低精度?对于后者,已发表的工作表明,如果较高的精度提供至少 2n+k 位而不是较低的 n 位精度(其中 k
-
当值从扩展精度中弹出时截断。我已经用额外的解释更新了这个问题。
-
不清楚你在这里问什么。你。将给定的操作序列与什么进行比较?
-
@EJP 在 FP 计算过程中使用更高的 FP 精度与在计算过程中使用相同精度(与使用的 FP 类型相同)相比它的行为
标签: floating-point deterministic