Questions tagged «ieee-754»

IEEE 754是最常见且使用最广泛的浮点标准,特别是单精度binary32 aka浮点数和双精度binary64 aka双重格式。

3
为什么使用英特尔C ++编译器的NaN-NaN == 0.0?
众所周知,NaN是以算术方式传播的,但是我找不到任何演示,因此我写了一个小测试: #include <limits> #include <cstdio> int main(int argc, char* argv[]) { float qNaN = std::numeric_limits<float>::quiet_NaN(); float neg = -qNaN; float sub1 = 6.0f - qNaN; float sub2 = qNaN - 6.0f; float sub3 = qNaN - qNaN; float add1 = 6.0f + qNaN; float add2 = qNaN + qNaN; float …
300 c++  c  floating-point  ieee-754  icc 

12
对于IEEE754 NaN值,所有比较返回false的理由是什么?
为什么NaN值的比较与所有其他值都不同?也就是说,与一个或两个值均为NaN的运算符==,<=,> =,<,>进行的所有比较均返回false,这与所有其他值的行为相反。 我想这以某种方式简化了数值计算,但是我找不到明确陈述的理由,甚至在Kahan撰写的关于IEEE 754状态的讲义中也没有详细讨论其他设计决策。 在进行简单的数据处理时,这种异常行为会引起麻烦。例如,当在C程序中对带有某些实值字段的记录列表进行排序时,我需要编写额外的代码以将NaN作为最大元素来处理,否则排序算法可能会变得混乱。 编辑: 到目前为止,所有答案都表明,比较NaN毫无意义。 我同意,但这并不意味着正确答案是错误的,而是一个非布尔值(NaB),幸运的是不存在。 因此,在我看来,选择比较返回真还是假是任意的,并且对于一般数据处理,如果遵循通常的规律(反射性为==,三分法为<,==,>),则最好避免数据结构,这将是有利的依靠这些法律变得混乱。 因此,我要求打破这些法律的某些具体优势,而不仅仅是哲学推理。 编辑2: 我想我现在明白为什么将NaN设为最大值会是个坏主意,它将使上限计算变得混乱。 NaN!= NaN可能需要避免检测诸如 while (x != oldX) { oldX = x; x = better_approximation(x); } 但是最好通过比较绝对差和较小的限制来写出。因此恕我直言,这对于打破NaN的反射率是一个相对较弱的论点。



2
IEEE 754浮点数不能准确表示的第一个整数是哪个?
为了清楚起见,如果我使用的是实现IEE 754浮点数的语言,则我声明: float f0 = 0.f; float f1 = 1.f; ...然后将它们打印出来,我将得到0.0000和1.0000-准确。 但是,IEEE 754不能表示真实数字中的所有数字。接近零,“间隙”很小;随着距离的增加,差距会越来越大。 因此,我的问题是:对于IEEE 754浮点数,它是无法精确表示的第一个(最接近零)整数吗?我现在只真正关心32位浮点数,尽管如果有人给我64位的答案,我将很感兴趣! 我认为这很简单,只需计算2个bits_of_mantissa并加1,其中bits_of_mantissa是标准公开的位数。我是在我的机器(MSVC ++,Win64)上针对32位浮点数执行此操作的,但看起来还不错。

4
为什么4 * 0.1的浮点值在Python 3中看起来不错,但3 * 0.1却不这样?
我知道大多数小数都没有确切的浮点表示形式(浮点数学运算符是否损坏?)。 但是,当两个值实际上都具有丑陋的十进制表示形式时,我看不出为什么4*0.1将其很好地打印为0.4,但3*0.1不是这样: >>> 3*0.1 0.30000000000000004 >>> 4*0.1 0.4 >>> from decimal import Decimal >>> Decimal(3*0.1) Decimal('0.3000000000000000444089209850062616169452667236328125') >>> Decimal(4*0.1) Decimal('0.40000000000000002220446049250313080847263336181640625')

10
C#中的浮点数学是否一致?是真的吗?
不,这不是另一个“为什么(1 / 3.0)* 3!= 1”问题。 最近,我一直在阅读有关浮点的文章;具体而言,相同的计算如何在不同的体系结构或优化设置上产生不同的结果。 对于存储重放或对等网络(而不是服务器-客户端)的视频游戏来说,这是一个问题,它们依赖于所有客户端在每次运行程序时都产生完全相同的结果-一个小小的差异浮点计算可能导致不同机器(甚至同一台机器上!)的游戏状态发生极大的变化。 即使在“遵循” IEEE-754的处理器之间也会发生这种情况,主要是因为某些处理器(即x86)使用双精度扩展精度。也就是说,它们使用80位寄存器进行所有计算,然后将其截断为64位或32位,从而导致舍入结果与使用64位或32位计算的机器不同。 我在线上已经看到了针对此问题的几种解决方案,但是所有解决方案都是针对C ++而不是C#: double使用_controlfp_s(Windows),_FPU_SETCW(Linux?)或fpsetprec(BSD)禁用双精度扩展模式(以便所有计算均使用IEEE-754 64位)。 始终以相同的优化设置运行相同的编译器,并要求所有用户具有相同的CPU架构(禁止跨平台使用)。因为我的“编译器”实际上是JIT,所以每次运行程序时它的优化方式都可能不同,所以我认为这是不可能的。 使用定点算法,float并double完全避免。decimal可以用于此目的,但是会慢很多,并且没有System.Math库函数支持它。 那么,这甚至在C#中是一个问题吗? 如果我仅打算支持Windows(不支持Mono)怎么办? 如果是,是否有任何方法可以强制我的程序以正常的双精度运行? 如果没有,是否有任何库可以帮助保持浮点计算的一致性?

12
是否可以通过减去两个不相等的浮点数来获得0?
在下面的示例中是否可以除以0(或无穷大)? public double calculation(double a, double b) { if (a == b) { return 0; } else { return 2 / (a - b); } } 在正常情况下,当然不会。但是如果a和b非常接近,会由于计算精度而(a-b)导致结果0吗? 请注意,这个问题是针对Java的,但是我认为它将适用于大多数编程语言。

3
PHP中的类型变戏法和(严格)大于/小于
PHP以其类型杂耍而闻名。我必须承认,这使我感到困惑,而且我很难在比较中找出基本的逻辑/基础知识。 例如:如果$a > $b为true并且$b > $c为true,是否还必须意味着$a > $c也始终为 true? 按照基本逻辑,我会说是,但是我对此感到困惑,因为我并不真的相信PHP。也许有人可以提供一个例子,而事实并非如此? 我也想知道使用严格的小于运算符和严格大于运算符(因为它们的含义被描述为严格的,我过去仅从相等性比较中知道),如果左右运算符与之互换,是否会有所不同严格不相等的值: # Precondition: if ($a === $b) { throw new Exception( 'Both are strictly equal - can not compare strictly for greater or smaller' ); } ($a > $b) !== ($b > $a) 对于大多数类型比较组合,大多数较大/较小的比较运算符均未记录在文档中,因此在这种情况下阅读手册并没有真正的帮助。



3
什么是次正规浮点数?
isnormal()参考页告诉您: 确定给定的浮点数arg是否正常,即既不是零,次正规,无穷也不是NaN。 一个数字为零,无穷大或NaN很清楚这意味着什么。但这也说不合正常。什么时候是次正规的?

7
在16位,32位和64位IEEE-754系统中可以表示什么范围的数字?
我对浮点数的表示方式有些了解,但恐怕还不够。 普遍的问题是: 对于给定的精度(出于我的目的,以10为基数的精确小数位数),对于16位,32位和64位IEEE-754系统,可以表示什么数字范围? 具体来说,我只对精度为+/- 0.5(一个位)或+/- 0.0005(千个位)的16位和32位数字范围感兴趣。

3
是否允许JS引擎更改NaN的位?
在JavaScript中,NaN值可由内部广泛的64位double表示。具体来说,具有以下按位表示形式的任何double: x111 1111 1111 xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx 被解释为NaN。我的问题是:假设我使用ArrayBuffers将两个32位uint强制转换为一个JS Number,将其传递,然后将其强制转换为两个32位uint。恢复的位是否将与原始位相同,还是允许JS引擎随意更改NaN的位?换句话说,JS号码可以用来无损地存储64位吗?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.