- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
为什么 NaN 值的比较与所有其他值的表现不同?
也就是说,所有与运算符 ==、<=、>=、<、> 的比较,其中一个或两个值为 NaN,都返回 false,这与所有其他值的行为相反。
我想这在某种程度上简化了数值计算,但我找不到明确说明的原因,甚至在 Lecture Notes on the Status of IEEE 754 中也找不到。由 Kahan 撰写,其中详细讨论了其他设计决策。
在进行简单的数据处理时,这种异常行为会造成麻烦。例如,当排序记录列表 w.r.t. C 程序中的一些实值字段我需要编写额外的代码来处理 NaN 作为最大元素,否则排序算法可能会变得困惑。
编辑:
到目前为止的答案都认为比较 NaN 是没有意义的。
我同意,但这并不意味着正确答案是错误的,
相反,它将是一个 Not-a-Boolean (NaB),幸运的是它不存在。
所以在我看来,选择返回 true 或 false 进行比较是任意的,
对于一般数据处理,如果遵守通常的法律将是有利的
(== 的自反性,<、==、> 的三分法),
以免依赖这些规律的数据结构变得困惑。
所以我要求打破这些法律的一些具体优势,而不仅仅是哲学推理。
编辑 2:
我想我现在明白为什么将 NaN 设为最大值是一个坏主意,它会搞乱上限的计算。
NaN != NaN 可能需要避免检测循环中的收敛,例如
while (x != oldX) {
oldX = x;
x = better_approximation(x);
}
最佳答案
我是 IEEE-754 委员会的成员,我会尽力帮助澄清一些事情。
首先,浮点数不是实数,浮点运算不满足实数运算的公理。三分法并不是真正算术中唯一不适合浮点数的属性,甚至不是最重要的属性。例如:
(y < x)
询问是否
y
小于
x
.如
y
是 NaN,那么它不小于任何浮点值
x
,所以答案必然是错误的。
Four mutually exclusive relations are possible: less than, equal, greater than, and unordered. The last case arises when at least one operand is NaN. Every NaN shall compare unordered with everything, including itself.
x == y
应该等同于 x - y == 0
只要有可能(除了作为实数算术定理之外,这使得比较的硬件实现更加节省空间,这在标准制定时是最重要的——但是请注意,x = y = 无穷大时违反了这一点,所以这本身并不是一个很好的理由;它可以合理地倾向于 (x - y == 0) or (x and y are both NaN)
)。 isnan( )
NaN 在 8087 算术中被形式化时的谓词;有必要为程序员提供一种方便有效的方法来检测 NaN 值,而不依赖于提供诸如 isnan( )
之类的编程语言。这可能需要很多年。我将引用 Kahan 自己关于这个主题的文章:Were there no way to get rid of NaNs, they would be as useless as Indefinites on CRAYs; as soon as one were encountered, computation would be best stopped rather than continued for an indefinite time to an Indefinite conclusion. That is why some operations upon NaNs must deliver non-NaN results. Which operations? … The exceptions are C predicates “ x == x ” and “ x != x ”, which are respectively 1 and 0 for every infinite or finite number x but reverse if x is Not a Number ( NaN ); these provide the only simple unexceptional distinction between NaNs and numbers in languages that lack a word for NaN and a predicate IsNaN(x).
isnan( )
,但这将使 NaN 几乎不可能在几年内有效和方便地使用,而全世界都在等待编程语言的采用。我不相信这会是一个合理的权衡。
totalOrder
IEEE-754 (2008) 中标准化的谓词。事实上,它尚未说明卡汉的担忧是正确的,而这种担忧促使当前的事态发展。
关于floating-point - 对于 IEEE754 NaN 值,所有比较返回 false 的基本原理是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1565164/
除非 IEEE 754 是 NaN、+-0.0 或 +-Infinity,否则自除是否保证结果正好是 1.0? 同样,减去本身是否保证总是导致 +-0.0? 最佳答案 IEEE 754-2008 4.
我已经阅读了一些文本和线程,展示了如何从十进制转换为 IEEE 754,但我仍然对如何在不扩展小数(以科学计数法表示)的情况下转换数字感到困惑 我特别使用的数字是9.07 * 10^23,但任何数字都
为什么 float 中的指数要置换 127? 那么,真正的问题是:与 2 的补码相比,这种表示法有什么优势? 最佳答案 由于存储的指数是无符号的,因此可以使用整数指令来比较浮点值。为了比较(不是补码)
我一直在使用 Mendeley 的 Microsoft Word 插件轻松引用我的 Mendeley 桌面图书馆中的论文。 但是,我注意到 IEEE 格式的引用书目/引文在引用 session 记录和
我花了一周的时间研究这个主题,发现没有语言能够正确满足 IEEE 754 规范。 甚至 GCC 也不尊重相关的 C99 部分(它忽略了 FENV_ACCESS 编译指示,并且我被告知我的工作示例纯粹是
有很多 IEEE 标准。几乎所有语言都保证实现 IEEE 754 二进制 float 。 最佳答案 我认为这只是流水号,就像 IRC 有 RFC1459 关于ieee-754 - IEEE 754 f
我们在类里面有一个作业,要使用 c 从十进制转换为单精度,但我完全迷失了。 这是作业: The last part of this lab involves coding a short c algo
我使用的是在 SoftFloat 库中实现的半 float (阅读:100% IEEE 754 兼容),为了完整起见,我希望为我的代码提供与 float.h> 用于 float、double 和 lo
我很难理解IEEE 754舍入约定: 四舍五入为正无穷大 四舍五入为负无穷大 无偏到最接近的偶数 如果我在二进制点的右边有一个由9位组成的二进制数,并且我需要使用最右边的3位来确定舍入该怎么办? 这是
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 4年前关闭。 Improve this questi
我创建了以下程序来查找 float 的位模式。但我的计算结果有所不同: #include int main(void){ float f = 1.234; char *ch;
我在 18 位软核处理器目标上有一个 gcc 交叉编译器定义了以下数据类型:18 位整数、36 位长整型和 36 位 float (单精度)。现在我的重点是浮点运算。由于宽度是非标准(36位),我有以
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 8 年前。 Improve th
Analog Devices 的 BFF-533 处理器不提供原生浮点支持,但提供浮点仿真。 使用 IDE VisualDSP++,用户可以在高性能浮点和严格的 IEEE 合规性之间进行选择。 据我了
我在没有浮点单元的处理器上工作,所以我必须为用户界面使用固定或自定义浮点类型。 对于这三种类型,say a multiply 的性能如何: IEEE float (32) 具有 16 位有符号值和有符
我对浮点数的工作原理有很好的理解,但我想知 Prop 体的指数和尾数大小是如何决定的。它们在某些方面是最优的吗?如何测量浮点表示的最优性(我假设有几种方法)?我想这些问题在官方标准中得到了解决,但我无
任何人都建议使用良好的压缩算法,该算法可与 double 浮点值一起很好地工作?我们发现,对于浮点值的二进制表示,使用常见的压缩程序(例如Zip,RAR,7-Zip等)会导致非常差的压缩率。 我们需要
我正在尝试将 0.0000211 转换为二进制。目前我的理解是这样的: E = -偏差 + 1。偏差 = 15,E = -14 符号位和指数 = 0。 所以我有: 0 00000 ?????????
我试图找出 ieee 754 中存在多少个不同的整数。我得到的数字是 1778384895,但我找不到任何资源来检查自己。预先非常感谢。 最佳答案 我将假设单精度 float 。 我们得到了零,虽然可
在运行 32 位 GCC 7.3.0 的特定在线判断中,这个: #include volatile float three = 3.0f, seven = 7.0f; int main() {
我是一名优秀的程序员,十分优秀!