Tag:

如何在ANSI C中生成NaN,-Infinity和+ Infinity?

我使用ANSI C89(不是C ++),我想生成NaN,-Infinity和+ Infinity。 有没有标准的方法(如标准macros)? 还是有任何平台和编译器独立的方式来产生这些数字? float f = 0.0 / 0.0; // Is f ALWAYS in any platform is NaN?

哪个是isnan()的Swift等价物?

在Swift中, isnan()是等价的吗? 我需要检查一些操作结果是否有效,并删除像x / 0那样的无效谢谢

安静的NaN和信号NaN有什么区别?

我已经阅读了浮点数,并且我明白NaN可能来自操作。 但我完全不明白这些概念是什么。 有什么区别? 在C ++编程中可以生成哪一个? 作为一名程序员,我可以编写一个程序来创build一个sNaN吗?

NaN的位模式是否真的依赖于硬件?

我正在阅读Java语言规范中的浮点型NaN值(我很无聊)。 一个32位float有以下格式: seee eeee emmm mmmm mmmm mmmm mmmm mmmm s是符号位, e是指数位, m是尾数位。 NaN值被编码为全1的指数,并且尾数位不全是0(这将是+/-无穷大)。 这意味着有许多不同的可能的NaN值(具有不同的s和m位值)。 对此, JLS§4.2.3说: IEEE 754为其单个和双个浮点格式中的每一个都允许多个不同的NaN值。 当生成新的NaN时,每个硬件体系结构为NaN返回一个特定的位模式,程序员也可以创build具有不同位模式的NaN,以编码例如回顾性​​诊断信息。 JLS中的文本似乎意味着例如0.0/0.0的结果具有依赖于硬件的位模式,并且取决于该expression式是否被计算为编译时间常数,它所依赖的硬件可能是Java程序编译的硬件或程序运行的硬件。 如果这是真的,这一切似乎非常片断。 我跑了下面的testing: System.out.println(Integer.toHexString(Float.floatToRawIntBits(0.0f/0.0f))); System.out.println(Integer.toHexString(Float.floatToRawIntBits(Float.NaN))); System.out.println(Long.toHexString(Double.doubleToRawLongBits(0.0d/0.0d))); System.out.println(Long.toHexString(Double.doubleToRawLongBits(Double.NaN))); 我的机器上的输出是: 7fc00000 7fc00000 7ff8000000000000 7ff8000000000000 输出结果没有显示出预期的结果。 指数位全部为1.尾数的高位也是1,对于NaN,这显然表示“安静的NaN”,而不是“信号NaN”( https://en.wikipedia.org/wiki/NaN# Floating_point )。 符号位和尾数位的其余部分都是0.输出还显示在我的机器上生成的NaN与来自Float和Double类的常量NaN之间没有差别。 我的问题是, 无论编译器或虚拟机的CPU如何,Java的输出是否保证 ,还是真的不可预测? JLS对此很神秘。 如果输出保证为0.0/0.0 ,是否有任何生成NaN的算术方法,其他(可能是硬件相关的)位模式? (我知道intBitsToFloat / longBitsToDouble可以编码其他的NaN,但我想知道如果其他值可以发生在正常的算术)。 后续要点:我注意到, Float.NaN和Double.NaN指定了它们的确切位模式,但是在源代码( 浮点 , 双 精度 )中,它们是由0.0/0.0生成的。 如果这种划分的结果真的取决于编译器的硬件,那么规范或实现似乎就有缺陷。

为什么与NaN不同,为什么浮点数无穷大?

为什么无限比较遵循适用于NaN的逻辑? 此代码打印出三次false : double a = Double.NaN; double b = Double.NaN; System.out.println(a == b); // false System.out.println(a < b); // false System.out.println(a > b); // false 但是,如果将Double.NaN更改为Double.POSITIVE_INFINITY ,则对于等于或小于比较,我会得到相等的结果: double a = Double.POSITIVE_INFINITY; double b = Double.POSITIVE_INFINITY; System.out.println(a == b); // true System.out.println(a < b); // false System.out.println(a > b); // false 这似乎很危险。 假设无限值是由溢出产生的,那么我认为在完美算术中,两个以infinities结尾的variables实际上是不相等的。

从数组中删除nan值

我想弄清楚如何从我的数组中删除nan值。 它看起来像这样: x = [1400, 1500, 1600, nan, nan, nan ,1700] #Not in this exact configuration 我相对较新的Python,所以我还在学习。 有小费吗?

为什么NaN不等于NaN?

相关的IEEE标准定义了一个数字常数NaN(不是数字),并且规定NaN应该与自身不相等。 这是为什么? 我熟悉的所有语言实现这个规则。 但是它往往会导致严重的问题,例如NaN存储在容器中,NaN处于正在排序的数据等等时出现的意外行为。更不用说,绝大多数程序员希望任何对象都等于自己在他们了解NaN之前),令他们惊讶的是增加了错误和混乱。 IEEE的标准是经过深思熟虑的,所以我相信有一个很好的理由,为什么NaN比较自己会是不好的。 我只是无法弄清楚它是什么。