Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Floating point 不是数字(NaN)_Floating Point_Number Formatting_Arithmeticexception_Arithmetic Overflow - Fatal编程技术网

Floating point 不是数字(NaN)

Floating point 不是数字(NaN),floating-point,number-formatting,arithmeticexception,arithmetic-overflow,Floating Point,Number Formatting,Arithmeticexception,Arithmetic Overflow,为什么有些数字在浮点运算中被定义为非数字(NaN)? (尽管它们可以用IEEE格式表示,实际上是实数)问题的作者也发表了以下评论: 我不明白为什么“所有指数位都是1,尾数不全是零”的数字不是实数 此注释背后的原因似乎是:二进制浮点格式有符号位s、一些指数位e和一些有效位f。对于e的大多数值,表示的值为(−1) s•1.f•2e bias(其中“1.f”是由“1”串联而成的二进制数字,而位f和bias是指数的编码偏差)。在这种方案中,所有1的指数值都是一个数字,那么它如何是NaN呢 答案是IEEE

为什么有些数字在浮点运算中被定义为非数字(NaN)?
(尽管它们可以用IEEE格式表示,实际上是实数)

问题的作者也发表了以下评论:


我不明白为什么“所有指数位都是1,尾数不全是零”的数字不是实数

此注释背后的原因似乎是:二进制浮点格式有符号位s、一些指数位e和一些有效位f。对于e的大多数值,表示的值为(−1) s•1.f•2e bias(其中“1.f”是由“1”串联而成的二进制数字,而位f和bias是指数的编码偏差)。在这种方案中,所有1的指数值都是一个数字,那么它如何是NaN呢

答案是IEEE-754标准规定了浮点编码的位代表什么,并且规定:

  • 如果e为零,则表示的值为(−1) s•0.f•2emin,其中emin是格式的最小指数。(emin等于1-bias。)
  • 如果e不是全零或全1,则表示的值为(−1) s•1.f•2e偏差
  • 如果e为1,f为0,则表示的值为(−1) s•∞.
  • 如果e为全1且f不为零,则表示的值为NaN。(关于发信号的NaN与安静的NaN以及使用f的位传送附加信息,存在一些依赖于实现的细节。)
事实上,存在一种表示e之间(但不包括)的值的模式全零和全一并不意味着模式必须扩展到e为全零或全1时。逻辑或物理方面的任何内容都不会迫使我们设计将模式扩展到e的所有值的硬件。规则如上所述制定,IEEE-754浮点实现遵循这些规则

此外,上面描述的值形成一组IEEE-754调用浮点数据的值−∞ 及+∞, 由s、e和f的值产生的各种非零实数,由符号区分的两个“零”:−0和+0以及NaN。IEEE-754算术运算规范中的大部分都使用了这些值。例如,加法被定义为产生一个结果,就好像计算了精确的数学和,然后对其应用了舍入规则。每个舍入规则都指定,如果值超出特定的界限,则结果为infini否则,精确的数学和将在舍入规则指定的方向上舍入到最接近的可表示值(例如,在任一方向上最接近,朝向)+∞, 朝向−∞, 或接近零)


因此,当IEEE-754在硬件或软件中实现时,实现被设计为遵循这些规则。当规则说要产生无穷大时,实现产生表示无穷大的位模式。当输入操作数具有无穷大的位模式时,实现将其视为无穷大,而不是无穷大作为实数,它将表示指数编码是否具有扩展正常数字模式的意义。

问题的作者也发表了以下评论:


我不明白为什么“所有指数位都是1,尾数不全是零”的数字不是实数

此注释背后的原因似乎是:二进制浮点格式具有符号位s、一些指数位e和一些有效位f。对于e的大多数值,表示的值为(−1) s•1.f•2e bias(其中“1.f”是由“1”串联而成的二进制数字,而位f和bias是指数的编码偏差)。在这种方案中,所有1的指数值都是一个数字,那么它如何是NaN呢

答案是IEEE-754标准规定了浮点编码的位代表什么,并且规定:

  • 如果e为零,则表示的值为(−1) s•0.f•2emin,其中emin是格式的最小指数。(emin等于1-bias。)
  • 如果e不是全零或全1,则表示的值为(−1) s•1.f•2e偏差
  • 如果e为1,f为0,则表示的值为(−1) s•∞.
  • 如果e为全1且f不为零,则表示的值为NaN。(关于发信号的NaN与安静的NaN以及使用f的位传送附加信息,存在一些依赖于实现的细节。)
事实上,存在一种表示e之间(但不包括)的值的模式全零和全一并不意味着模式必须扩展到e为全零或全1时。逻辑或物理方面的任何内容都不会迫使我们设计将模式扩展到e的所有值的硬件。规则如上所述制定,IEEE-754浮点实现遵循这些规则

此外,上面描述的值形成一组IEEE-754调用浮点数据的值−∞ 及+∞, 由s、e和f的值产生的各种非零实数,由符号区分的两个“零”:−0和+0以及NaN。IEEE-754算术运算规范中的大部分都使用了这些值。例如,加法被定义为产生一个结果,就好像计算了精确的数学和,然后对其应用了舍入规则。每个舍入规则都指定,如果值超出特定的界限,则结果为infini否则,精确的数学和将在舍入规则指定的方向上舍入到最接近的可表示值(例如,在任一方向上最接近,朝向)+∞, 朝向−∞, 或接近零)

因此,当IEEE-754在硬件或软件中实现时,实现是按照这些规则设计的。当规则说要产生无穷大时,实现产生比特模式