固定尺寸的浮子/双人便于携带

时间:2016-10-14 14:43:47

标签: c floating-point portability

我最近了解了固定大小的整数,并计划在几年前写的旧程序中使用它们。

对于float和/或double,是否有任何等价的固定大小的int?

我的计划是使用"原生类型" from checker.checker import check_board_state, check_row, check_winner,\ check_column, check_diagonal import sys import unittest class TestChecker(unittest.TestCase): def test_winner_row(self): check_board_state([['o', 'x', '.'], ['o', 'o', 'o'], ['.', 'x', 'o']]) output = sys.stdout.getvalue().strip() assert output == 'o' def test_draw(self): check_board_state([['.', 'x', '.', 'o', 'o'], ['o', 'o', 'x', '.', '.'], ['.', 'o', 'x', '.', '.'], ['.', 'o', 'x', '.', '.'], ['.', 'o', 'x', '.', '.']]) output = sys.stdout.getvalue().strip() assert output == '.' if __name__ == '__main__': unittest.main() 用于程序的最大部分,并且仅在可移植性受到关注时指定固定大小类型(如使用二进制文件读/写)。 我使用二进制文件存储数据,如:date yyyymmdd (所以int,float,double),flags [0,4](所以uint32),字符串(空终止字符串)和货币(现在它是uint8)。

关于便携性,该计划是便携式的,并且#34;是可以编译(或交叉编译)并在不同平台上运行的意义。到目前为止:linux,windows,android(本机地,通过没有GUI的终端模拟器)和OpenBSD(strcat / strcpy只需要用2行中的strlcat / strlcpy替换)。 如果我在linux x86_64,android arm-something,windows 32 某些东西等之间使用相同的二进制数据文件,我担心存储的float / double会发生什么...我希望有一种在二进制文件中强制使用浮点值的唯一大小和表示的方法。

2 个答案:

答案 0 :(得分:1)

对于货币,建议特殊处理。选择固定宽度整数类型以满足范围需求(int64_tint32_t)并按最小货币单位进行缩放。如果代码只存储/读取123.12

等值
void Store_int32(int32_t x); // Handles int32_t in endian independent method
int32_t Get_int32(void);     // Handles int32_t in endian independent method

void Store_Currency(double c) {
  if (c < INT32_MIN/100.0 || c > INT32_MAX/100.0) Handle_RangeError();
  Store_int32(round(c*100.0));
}

double Get_Currency(void) {
  Get_int32()/100.0;
}

对于double的一般用法,请使用转换to /来自文本十六进制(或具有足够精度的十进制)FP表示法。

void Store_double(double c) {
  char s[100];
  sprintf(s, "%a", c);                         // 0x1.ec7ae147ae148p+6
  // or
  sprintf(s, "%.*e", DBL_DECIMAL_DIG - 1, c);  // 1.2312000000000000e+02
  Store_string(s);
}

double Get_double(void) {
  char s[100];
  Get_string(s, sizeof s);
  double x;
  sscanf(s, "%f", &x);  // %f reads decimal and hexadecimal FP formats.
  return x;
}

答案 1 :(得分:0)

大多数浮点数是IEEE 754,64位或32位。但是,如果处理器中的浮点单元不兼容,则没有现实,有效的方法使其兼容,因此程序在不同的机器上运行时会产生稍微不同的结果。 (这实际上是对声音程序的一个很好的测试 - 如果由于浮点错误导致结果显着不同,那么你正在严重处理浮点运算。)

然而,您可以移植地在二进制文件中加载并保存最接近IEEE 754的表示。代码在此处维护 here