提问人:Tah_Ra 提问时间:10/15/2023 最后编辑:chqrlieTah_Ra 更新时间:11/2/2023 访问量:111
在 C 中将二进制分数分配给浮点变量
Assigning binary fraction to float variable in C
问:
我正在尝试做如下事情
#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;
}
我在这里的唯一目标是分配小数二进制数,该二进制数是并且应该导致 .有人知道吗?b
0.0110
0.375
答:
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 的幂表示。0x
0X
ABC.DEF
p
P
p-3
默认情况下,十六进制浮点常量具有类型。如果十六进制浮点常量以 或 为后缀,则 如果以 或为后缀,则其类型为 。double
f
F
float
l
L
long double
引用上面的表格,所需的 OP 可以用十六进制书写,因为等同于十六进制数字。指数是必需的,它表示不应缩放有效数。0b0.0110
0x0.6p0
0110
6
p0
下面是一个代码示例:
#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;
评论
double b = 0b00110 / 2. / 2. / 2. / 2.;
:-)double
float
double