Tag: 浮点

用C序列化double和float

如何在C中序列化双打和浮点数? 我有以下代码来序列化short,int和chars。 unsigned char * serialize_char(unsigned char *buffer, char value) { buffer[0] = value; return buffer + 1; } unsigned char * serialize_int(unsigned char *buffer, int value) { buffer[0] = value >> 24; buffer[1] = value >> 16; buffer[2] = value >> 8; buffer[3] = value; return buffer + 4; } unsigned char * serialize_short(unsigned […]

C中的浮点运算是关联的吗?

加法在数学上保持关联属性: (a + b) + c = a + (b + c) 在一般情况下,此属性不适用于浮点数,因为它们表示有限精度的值。 作为优化的一部分,是否允许编译器在从C程序生成机器代码时进行上述替换? 它在C标准中的确切位置在哪里?

比较目标C中的float和double数据类型

当在iPhone应用程序中使用double或float数据类型时,我遇到了“> =”和“ = 4.2”是错误的而不是真的。 我该如何避免这个问题?

浮动到int意外行为

你能解释一下这个程序的o / p行为吗? int main() { float a = 12.5; printf(“%d\n”, a); printf(“%d\n”, *(int *)&a); return 0; } 可以请访问http://codepad.org/AQRlAzkC查看代码 为什么这个输出会来……

x86和x64之间的浮点算术的差异

我偶然发现了在x86和x64的MS VS 2010版本之间完成浮点算术的方式不同(两者都在同一台64位机器上执行)。 这是一个简化的代码示例: float a = 50.0f; float b = 65.0f; float c = 1.3f; float d = a*c; bool bLarger1 = d<b; bool bLarger2 = (a*c)<b; 布尔bLarger1始终为false(在两个版本中d都设置为65.0)。 变量bLarger2对于x64为false,但对于x86为true! 我很清楚浮点算术和圆角效应正在发生。 我也知道32位有时使用不同的指令进行浮动操作而不是64位构建。 但在这种情况下,我错过了一些信息。 为什么bLarger1和bLarger2之间首先存在差异? 为什么它只出现在32位构建中?

当y是整数时,fmod()是否准确?

在使用double fmod(double x, double y)且y是整数时,结果似乎总是精确的。 (这是一个完整的数字,在这里不是int 。) 也许C 不需要 fmod()在这些选择的情况下提供精确的答案,但是在我尝试过的编译器上,结果是准确的,即使x/y的商不能完全表示。 当y是整数时,是否期望得到确切的答案? 如果没有,请提供一个反例。 例子: double x = 1e10; // x = 10000000000 printf(“%.50g\n”, fmod(x, 100)); // prints 0 x = 1e60; // x = 999999999999999949387135297074018866963645011013410073083904 printf(“%.50g\n”, fmod(x, 100)); // prints 4 x = DBL_MAX; // x = 179769313486231570…6184124858368 printf(“%.50g\n”, fmod(x, 100)); // prints 68 x = […]

将double / float转换为字符串

我需要将浮点数转换为十进制(或其他基数)中的等效字符串。 首先需要以xE+0格式进行转换,其中x是浮点数。 我的想法是首先将浮点数截断为临时整数,然后将该整数转换为字符串,然后考虑小数部分,将其乘以10而小数部分不变为0 。 将小数部分转移到小数点的左侧后,再次将整数应用于字符串函数,并将小数部分转换为字符串。 有没有更好的方法,哪个比这更快? 这种方法会引起任何副作用吗? 要将浮点数转换为指数表示,我应该如上所述,然后调整功率吗? 或者直接对IEEE 754浮点表示进行位掩码,并将每个部分转换为字符串。 注意:不能使用其他function,因为我可以访问绝对没有库函数。 这段代码进入玩具内核。

当在printf中使用%d时,float变量会发生什么?

我正在尝试通过阅读C编程语言第2版来学习C. 我有一些编程经验,但没有C. 我目前在第1章。我有以下代码: float f; for (f = 0.0; f <= 3; f += 1.1) printf("A: %3f B: %6.2f\n", f, f + 0.15); 它打印输出: A: 0.000000 B: 0.15 A: 1.100000 B: 1.25 A: 2.200000 B: 2.35 看起来很好。 现在我按如下方式更改printf: printf(“A: %3d B: %6.2f\n”, f, f + 0.15); 新的输出是 A: 0 B: 0.00 A: -1610612736 B: 0.00 […]

C ++浮点精度

可能重复: 浮点不准确的例子 double a = 0.3; std::cout.precision(20); std::cout << a << std::endl; 结果:0.2999999999999999889 double a, b; a = 0.3; b = 0; for (char i = 1; i <= 50; i++) { b = b + a; }; std::cout.precision(20); std::cout << b << std::endl; 结果:15.000000000000014211 所以..’a’比它应该小。 但是,如果我们采取’a’50次 – 结果会比它应该更大。 为什么是这样? 如何在这种情况下得到正确的结果?

在C中将float转换为int(按位)

给定代表IEEE 754浮点数的32位,如何使用表示上的整数或位操作(而不是使用机器指令或编译器操作进行转换)将数字转换为整数? 编辑#1: 我必须遵循function但在某些情况下失败: 输入:int x(包含IEEE 754格式的32位单精度数) if(x == 0) return x; unsigned int signBit = 0; unsigned int absX = (unsigned int)x; if (x < 0) { signBit = 0x80000000u; absX = (unsigned int)-x; } unsigned int exponent = 158; while ((absX & 0x80000000) == 0) { exponent–; absX <> 8; unsigned int result […]