我试图用二进制表示小数,然后将其打印为浮点数。我已经完成了浮点转换的固定点。
十进制数:-342.265625
定点:-101010110.010001
32位浮点数:11000011101010110010001000000000
64位浮点数(双精度):1100000001110101011001000100000000000000000000000000000000000000
*我已经用IEEE 754转换器进行了双重检查
*我也知道printf更改会浮动到双打以打印它们,但是将它声明为double应该有效吗?我以为......?
代码:
int main()
{
float floaty = 0b11000011101010110010001000000000;
double doubley = 0b1100000001110101011001000100000000000000000000000000000000000000;
printf("Float: %f\n", floaty);
printf("Double: %lf\n", doubley);
}
输出:
Float: 3282772480.000000
Double: 13868100853597995008.000000
编译器是gcc,标准是c99
答案 0 :(得分:4)
来自gcc' s documentation:
这些常量的类型遵循与八进制或 十六进制整数常量,所以后缀如'L'或'UL'即可 应用
因此,您为float和double指定的二进制数实际上是整数类型,并且不直接映射到您指定的基础类型的位模式。
换句话说,这个:
float floaty = 3282772480;
double doubley = 13868100853597995008;
相当于:
<receiver
android:name="com.example.reciever.UnlockReceiver">
<intent-filter>
<action android:name="android.intent.action.USER_PRESENT" />
</intent-filter>
</receiver>
答案 1 :(得分:3)
问题是编译器正试图帮助你。您的文字(0b1 ...),顺便说一句是非标准扩展名,应该写成(0x ...),作为文字处理。然后,编译器会尽力将这些值放入您投射它们的变量中。因此,它会产生非常大的值,等于文字的整数值。
要直接指定变量的值,您必须使用联合(如果您不介意丢失一点可移植性,则使用指针)。此代码有效:
#include <stdint.h>
union floatint {
float f;
uint32_t i;
};
union doubleint {
double d;
uint64_t i;
};
int main()
{
floatint floaty;
doubleint doubley;
floaty.i = 0xC3AB2200;
doubley.i = 0xC075644000000000;
printf("Float: %f\n", floaty.f); // implementation-defined, in your case IEEE 754
printf("Double: %lf\n", doubley.d); // ditto
}
请注意,这是union的定义,两个(或更多)类型共享相同的表示形式,但处理方式不同。
答案 2 :(得分:2)
您可以将二进制常量与更多工作结合使用。
我们必须假设使用IEEE 754表示的浮点数,并且系统是小端的:
var openFile = function(event) {
console.log("1. onchange triggered");
var input = event.target;
var reader = new FileReader();
console.log("2. Set handler for onload event");
reader.onload = function(){
console.log("5. onload handler called. Now the file is ready");
var dataURL = reader.result;
var output = document.getElementById('output');
console.log("6. Set img src to image");
output.src = dataURL;
};
console.log("3. Start reading file");
reader.readAsDataURL(input.files[0]);
console.log("4. Try to look at the file read result, even though the file has not finished being read yet...");
var hello=reader.result;
console.log(hello);
console.log(reader.result);
};