使用0b表示来打印(printf)float

时间:2016-10-05 19:35:52

标签: c binary floating-point printf

我试图用二进制表示小数,然后将其打印为浮点数。我已经完成了浮点转换的固定点。

十进制数:-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

3 个答案:

答案 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);
 };