- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当您有符合 IEEE754 标准的浮点实现时,与 NaN
的任何比较都是 false
,即使是 NaN == NaN
,但是+inf == +inf
是 true
,为什么?
从我的角度来看,说 +inf == +inf
是假的更有意义,原因:
自然数和有理数的数,都是无限的,但又不一样。
如果您有 X=1e200
和 Y=1e300
(X 和 Y 都是 64 位 double ),那么 x== y
为 false
,但 x*1e200==y*1e200
为 true true
(均为 +inf),即数学不正确。
对于NaN
,已经需要特殊处理,其中X==X
为false
,所以不会有实现 +inf == +inf
返回 false
的实现复杂度要高得多。甚至可能更少,因为 inf
和 NaN
我们使用相同的“指数”。
我没有看到任何优势,或者任何需要 +inf == +inf
的应用程序。无论如何,您都不应该将任何浮点值与 ==
进行比较。
X==Y
是generel 然后true
,如果X-Y==0
是true
, 但 inf-inf
是 NaN
。
编辑
正如 nwellnhof allready 所写:链接的问题:C IEEE-Floats inf equal inf ,不一样,有问题“为什么语言实现是这样的?”,这里有问题“为什么标准是这样定义的?”。 (而且两个问题都来自同一个用户)
最佳答案
您可能不得不问 William Kahan,IEEE 754-1985 背后的主要架构师,但是 this answer阐明了该主题:
more importantly, there was no isnan( ) predicate at the time that NaN was formalized in the 8087 arithmetic; it was necessary to provide programmers with a convenient and efficient means of detecting NaN values that didn’t depend on programming languages providing something like isnan( ) which could take many years. I’ll quote Kahan’s own writing on the subject:
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 [emphasis added] but reverse if x is Not a Number ( NaN ); these provide the only simple unexceptional distinction between NaNs and numbers [emphasis added] in languages that lack a word for NaN and a predicate IsNaN(x).
如果+inf
不等于 +inf
, x != x
测试 NaN 是行不通的,因为它也会捕获无穷大。早在 1985 年,C 程序员就可以这样写:
#define is_nan(x) ((x) != (x))
#define is_pos_inf(x) ((x) == 1.0/0.0)
#define is_neg_inf(x) ((x) == -1.0/0.0)
与 inf != inf
,你需要这样的东西:
#define is_nan(x) (!((x) >= 0) && !((x) <= 0))
#define is_pos_inf(x) ((x) != (x) && (x) > 0.0)
#define is_neg_inf(x) ((x) != (x) && (x) < 0.0)
我明白你的意思,我同意 +inf != +inf
从纯数学的角度来看更正确。但 IMO,它并没有超过实际考虑。
The [sets] of natural numbers and rational numbers, both are infinite but [have] not the same [cardinality].
这与浮点计算没有太大关系。
If you have X=1e200 and Y=1e300 (both, X and Y are 64-bit doubles), so x==y is false, but x*1e200==y*1e200 is true true (both are +inf), which is mathematical incorrect.
float 学本质上是不正确的。您可以找到许多有限 float ,X
, Y
, Z
, 与 X != Y
, 其中X <op> Z == Y <op> Z
.
I do not see any advantage, or any application which require the fact that +inf == +inf. You should not compare any floating point values with == anyway.
我也看不到需要 +inf != +inf
的应用程序.
X==Y is [...] true, if X-Y==0 is true, but inf-inf is NaN.
这实际上与 +inf != +inf
不一致会解决。但对我来说这似乎是一个小细节。
关于floating-point - IEEE754 中 inf==inf 的基本原理是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41958609/
除非 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() {
我是一名优秀的程序员,十分优秀!