【发布时间】:2021-10-16 13:57:12
【问题描述】:
这么小问题,出于性能原因,我一直在考虑将我的 C# 代码的一部分转移到 C++。 现在,当我在 C# 中查看我的 float.Epsilon 时,它的值与我的 C++ 值不同。
在 C# 中,如 by microsoft 所述,值为 1.401298E-45。
在 C++ 中,如 by cppreferences 所述,值为 1.19209e-07;
浮点数/单数的最小可能值如何在这些语言之间有所不同?
如果我是正确的,二进制值在字节数方面应该相等,甚至可能是它们的二进制值。还是我看错了?
希望有人能帮助我,谢谢!
【问题讨论】:
-
epsilon 的定义不同。在 C# 中,ist 是 0 和下一个值之间的差值,而在 C++ 中,它是 1 和下一个值之间的差值。
-
Microsoft 页面上充斥着关于浮点的不良陈述。避免使用其中的信息。一些问题: (a) “零和一半的 Epsilon 值被认为是相等的”:
Float中不能有一半的 Epsilon 值;它是不可代表的。 (b) “格式由一个符号、一个 23 位尾数或有效位组成……”:有效位是 24 位,尽管在一个字段中存储为 23 位,根据指数字段存储为 1 位。 -
(c) “机器ε,表示舍入导致的相对误差的上界……”:可以作为单次操作误差的衡量标准,说的不太对上限或它是相对误差。使用四舍五入法,实际上限是 ULP 的 ½,而真正的相对误差有点复杂,因为它会随着 binade 的变化而变化。
-
(d)“右边的常数只精确到指定的数字”:两个值具有相同的精度;右边的那个是不准确的⅓。微软关于精度的声明是bad。
-
(e) “如果您创建一个自定义算法来确定两个浮点数是否可以被视为相等,您必须使用一个大于 Epsilon 常数的值来确定可接受的绝对余量两个值的差异被视为相等。”:There is no general solution for comparing floating-point numbers;每个应用程序都必须同时处理误报和误报,这可能对其具体情况有所不同。因此,“您必须使用大于 Epsilon 常数的值”是不正确的。
标签: c# c++ floating-point epsilon