【问题标题】:How to get the signed floating-point zero in C99?如何在 C99 中获得带符号的浮点零?
【发布时间】:2016-08-24 01:19:08
【问题描述】:

我们如何在 C99 中获得带符号的浮点零?其实,我想看看它的位模式。

【问题讨论】:

  • 所有浮点类型都是有符号的。如果你想要负零,那就另当别论了

标签: c floating-point c99


【解决方案1】:

有符号浮点零,我认为你的意思是负零。如果是这样,您可以使用-0.0

例子:

#include <stdio.h>
#include <string.h>

void test(double val)
{
   unsigned char array[sizeof(double)];

   memcpy(array, &val, sizeof(double));
   for (int i = 0; i < sizeof(double); ++i )
   {
      printf("%02hhx", array[i]);
   }
   printf("\n");
}

int main()
{
   double v1 = -0.0;
   double v2 = 0.0;

   test(v1);
   test(v2);
};

我的设置中的输出(64 位 Linux/gcc 4.8.4):

0000000000000080
0000000000000000

C 标准不要求支持负零。我只能找到像“在表示有符号零的实现”这样的短语。

如果编译器使用 IEEE 754 表示浮点数,则要求它们支持负零。来自https://en.wikipedia.org/wiki/Signed_zero#Representations

在 IEEE 754 二进制浮点数中,零值由有偏的指数和有效数字都表示为零。负零将符号位设置为 1。某些计算的结果可能会得到负零,例如作为负数的算术下溢的结果,或者−1.0*0.0,或者简单地作为−0.0

【讨论】:

  • 我不怀疑这在您测试它的 c 编译器上有效,但是您是否参考了标准?
  • 不错。请注意,对于printf("%02x", array[i]),由于默认参数提升,您将传递int 以获取无符号格式。我最近开始使用%02hhx,因为我意识到每个有理智的人都已经把它理解为“参数是int,但它是从unsigned char提升的。例如,请参阅 Clang 在github.com/TrustInSoft/tis-interpreter/issues/46 的警告
【解决方案2】:

你可以使用C语句:

float zero = 0.0f;

所有float 都已签名,这是float 数字格式的一部分

【讨论】:

    【解决方案3】:
    int main(){
    
      float f = 0.0f;
    
      //observe as an array of bytes
      unsigned char *c = (unsigned char *)(&f);
    
      //for each byte in the float
      for (int i = 0; i < sizeof(float); ++i){
    
        //for each bit in the byte
        for (int j = 0; j < sizeof(char) * CHAR_BIT; ++j){
    
          //print 1 or 0 based on the bit value
          ((c[i] >> j) & 1) ? printf("1") : printf("0");
    
        }
      }
    }
    

    看看Float Toy
    它是可视化 IEEE 浮点格式的有用工具。

    【讨论】:

      猜你喜欢
      • 2023-04-01
      • 1970-01-01
      • 2011-02-07
      • 2014-05-13
      • 1970-01-01
      • 2011-10-01
      • 2020-09-22
      相关资源
      最近更新 更多