在 C 中将二进制分数分配给浮点变量

Assigning binary fraction to float variable in C

提问人:Tah_Ra 提问时间:10/15/2023 最后编辑:chqrlieTah_Ra 更新时间:11/2/2023 访问量:111

问:

我正在尝试做如下事情

#include <stdio.h>

int main() {
    float a = 0b00000100;
    float b = 0b0.0110; // this line is not working
    printf("The value of first float is = %f\n", a * 15);
    printf("The value of second float is = %f\n", b);
    return 0;
}

我在这里的唯一目标是分配小数二进制数,该二进制数是并且应该导致 .有人知道吗?b0.01100.375

c 浮点 二进制 分数

评论

5赞 Barmar 10/15/2023
C 不支持二进制浮点文字。
3赞 pmg 10/15/2023
double b = 0b00110 / 2. / 2. / 2. / 2.;:-)
2赞 Weather Vane 10/15/2023
C23 引入了二进制整数文字,以前是 GCC 语言扩展。
0赞 Weather Vane 10/15/2023
旁白:请尽可能使用自然浮点型。这是古代教科书中的遗物,当时有点可怕,最好用于特定原因,例如记忆限制。doublefloatdouble
0赞 Shawn 10/15/2023
你在哪里看到任何说有效的 C 语法?

答:

0赞 Shon_Shon 10/15/2023 #1

我很快编写了以下代码:

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

float binary_f(char fraction[]){
  char *pointp; //pointer to the point
  long integer=strtol(fraction, &pointp, 2); //Gives the integer and the pointer to the point, at the same time!
  int point=(int)(pointp-fraction);
  
  long div = 2;
  int lenght=strlen(fraction);
  float result=0;
  
  for (int i=point+1;i<lenght;i++){
    if (fraction[i]=='1'){
      result+=(float)1/div; 
    }
    div <<= 1; //Multiply the divisor by 2
  }
  return result+(float)integer;
}

int main() {
  char fractionary[]="10.001";
  float a=binary_f(fractionary);
  printf("%f",a);
  return 0;
}

指纹:

2.125000

您可能会注意到,它并不是很强大,但它可以完成以下工作 这是预期的参数。

1赞 ad absurdum 10/16/2023 #2

标准 C 没有二进制浮点常量,请注意,二进制整数常量最近才通过 C23 添加到语言中;以前,二进制整数常量(如)仅作为特定于实现的扩展提供。0b00000100

但自 C99 以来,C 一直具有十六进制浮点常数。这些对于使用二进制表示很有用。16 个十六进制数字中的每一个都对应一个四位数二进制序列;如果你学会了这些,你可以快速记下二进制表示的十六进制等价物。

二元的 十六进制 二元的 十六进制
0000 0 1000 8
0001 1 1001 9
0010 2 1010 一个
0011 3 1011 B
0100 4 1100 C
0101 5 1101 D
0110 6 1110 E
0111 7 1111 F

C 中十六进制浮点常数的格式是十六进制前缀 ( 或 ),后跟十六进制小数常数 (例如, ),后跟(必填)二进制指数部分。二进制指数部分必须以 either 或 为前缀(例如,)。请注意,二进制指数以 2 的幂而不是 10 的幂表示。0x0XABC.DEFpPp-3

默认情况下,十六进制浮点常量具有类型。如果十六进制浮点常量以 或 为后缀,则 如果以 或为后缀,则其类型为 。doublefFfloatlLlong double

引用上面的表格,所需的 OP 可以用十六进制书写,因为等同于十六进制数字。指数是必需的,它表示不应缩放有效数。0b0.01100x0.6p001106p0

下面是一个代码示例:

#include <stdio.h>

int main(void) {
    // binary float: 0.0110
    double b = 0x0.6p0;

    // binary float: 1101 1110 1010 1101 . 1011 1110 1110 1111
    // hex float:     D    E    A    D   .  B    E    E    F
    double dead_beef = 0xDEAD.BEEFp0;
    double d_eadbeef = 0xD.EADBEEFp12; // `p12` moves the "decimal" point 12 binary digits to the right

    printf("b = %f\n", b);
    printf("dead_beef = %f\n", dead_beef);
    printf("d_eadbeef = %f\n", d_eadbeef);
}
> ./fc
b = 0.375000
dead_beef = 57005.745834
d_eadbeef = 57005.745834
2赞 chqrlie 11/2/2023 #3

即将推出的 C23 标准引入了整数语法,但没有引入浮点值的语法。0b0110

而不是你可以写:float b = 0b0.0110;

float b = 0b0110 / 16.F;

或者更多具有显式小数位数:

float b = 0b0110 * 0x1p-4F;

对于较旧的 C99 编译器:

float b = 0x6p-4F;