如何保证C中双精确的大小?

Jos*_*ein 3 c

所以,我知道stdint.h标题中的类型提供了标准化的宽度整数类型,但是我想知道用什么类型或方法来保证double跨平台的一个或其他浮点类型的大小?具体来说,这将处理包装数据void*

#include <stdio.h>
#include <stdlib.h>

void write_double(void* buf, double num)
{
  *(double*)buf = num;
}

double read_double(void* buf)
{
  return *(double*)buf;
}


int main(void) {
  void* buffer = malloc(sizeof(double));
  write_double(buffer, 55);
  printf("The double is %f\n", read_double(buffer));
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

在上面的程序中说,如果我将其void*写入文件或者如果它在另一个系统上使用,是否会有一些标准方法来保证浮点类型的大小或双倍?

chu*_*ica 5

如何保证C中双精确的大小?

使用 _Static_assert()

#include <limits.h>

int main(void) {
  _Static_assert(sizeof (double)*CHAR_BIT == 64, "Unexpected double size");
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

_Static_assert自C11起可用.否则代码可能会使用运行时断言.

#include <assert.h>
#include <limits.h>

int main(void) {
  assert(sizeof (double)*CHAR_BIT == 64);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

虽然这样可以确保a的大小double为64,但它并不能保证IEEE 754双精度二进制浮点格式的依从性.

代码可以使用 __STDC_IEC_559__

定义的实现__STDC_IEC_559__应符合本附录中的规范C11附录F IEC 60559浮点运算

然而,这可能过于严格.许多实现都遵循该标准的大部分内容,但仍然没有设置宏.


是否有一些标准的方法来保证浮点类型的大小或双倍?

最好的保证是将FP值写为十六进制表示或具有足够十进制数的指数.请参见Printf宽度说明符以保持浮点值的精度