Tag: 浮点

在K&R 2-1中解释此代码

我正在尝试确定各种浮点类型的范围。 当我读到这段代码时: #include main() { float fl, fltest, last; double dbl, dbltest, dblast; fl = 0.0; fltest = 0.0; while (fl == 0.0) { last = fltest; fltest = fltest + 1111e28; fl = (fl + fltest) – fltest; } printf(“Maximum range of float variable: %e\n”, last); dbl = 0.0; dbltest = 0.0; while (dbl […]

将int转换为在C中浮动时的奇怪行为

我对以下C程序的输出有疑问。 我尝试使用Visual C ++ 6.0和MinGW32(gcc 3.4.2)编译它。 #include int main() { int x = 2147483647; printf(“%f\n”, (float)2147483647); printf(“%f\n”, (float)x); return 0; } 输出是: 2147483648.000000 2147483647.000000 我的问题是:为什么两条线都不同? 将整数值2147483647转换为IEEE 754浮点格式时,它将近似为2147483648.0。 所以,我预计这两行都将等于2147483648.000000。 编辑 :值“2147483647.000000”不能是单精度浮点值,因为数字2147483647无法精确表示IEEE 754单精度浮点格式而不会丢失精度。

一元减号和浮点数转换的组合

考虑以下C语句: unsigned long x = 1; float a = -x; double b = -x; 我希望一元减项产生一个等于ULONG_MAX的无符号长值,a和b分别设置为ULONG_MAX的单精度和双精度表示。 这是我在32位Linux上使用gcc 4.4.7以及在64位Linux上使用Intel和PGI编译器获得的结果。 但是,对于64位Linux上的gcc(测试版本4.4.7,4.7.2和4.8.0,都带有-O0和-O2),双变量b具有预期值,但float a等于-1代替。 相比之下,以下语句将在我测试的所有编译器和系统上将a和b设置为ULONG_MAX的浮点表示: unsigned long x = 1; unsigned long y = -x; float a = y; double b = y; 如果我使用unsigned int而不是unsigned long,我也会在所有系统上得到预期的结果。 这是某种未定义的行为还是编译器错误?

将float序列化为32位整数的便携方式

我一直在努力寻找一种可移植的方法来序列化C和C ++中的32位浮点变量,以便发送到微控制器和从微控制器发送。 我希望格式足够明确,以便可以从其他语言完成序列化/反序列化,而无需太多努力。 相关问题是: C ++中双/浮点型二进制序列化的可移植性 用C序列化double和float c ++便携式转换为long to double 我知道在大多数情况下, 类型转换联合/ memcpy可以正常工作,因为浮动表示是相同的,但我宁愿有更多的控制和心灵。 到目前为止我想出的是以下内容: void serialize_float32(uint8_t* buffer, float number, int32_t *index) { int e = 0; float sig = frexpf(number, &e); float sig_abs = fabsf(sig); uint32_t sig_i = 0; if (sig_abs >= 0.5) { sig_i = (uint32_t)((sig_abs – 0.5f) * 2.0f * 8388608.0f); e […]

精确计算缩放互补误差函数,erfcx()

通常由erfcx指定的(指数)缩放互补误差函数在数学上定义为erfcx(x):= e x 2 erfc(x)。 它经常发生在物理学和化学中的扩散问题中。 虽然一些数学环境(如MATLAB和GNU Octave )提供此function,但它不存在于C标准数学库中,它只提供erf()和erfc() 。 虽然可以直接在数学定义上实现自己的erfcx() ,但这仅适用于有限的输入域,因为在正半平面erfc()下溢中等幅度的参数,而exp()溢出,例如,正如这个问题所述 。 为了与C一起使用,可以调整一些erfcx()开源实现,例如Faadeeva包中的实现 ,正如对这个问题的回答所指出的那样。 但是,这些实现通常不能为给定的浮点格式提供完全准确性。 例如,使用2 32个测试向量的测试显示由Faadeeva包提供的erfcx()的最大误差在正半平面中为8.41ulps,在负半平面中为511.68ulps。 准确实现的合理界限是4 ulps,对应于英特尔矢量数学库的LA配置文件中数学函数的精度界限,我发现这对于需要两者的非平凡数学函数实现是一个合理的界限。准确性好,性能好。 如何只使用C标准数学库,并且不需要外部库, erfcxf() erfcx()和相应的单精度版本erfcxf()如何准确实现? 我们可以假设C的float nad double类型映射到IEEE 754-2008 binary32和binary64浮点类型。 可以假设硬件支持融合乘法 – 加法运算(FMA),因为此时所有主要处理器架构都支持此function。

如何打印浮点数的每一位?

我试图在C中打印出浮点数的每一位。 我可以用这个整数做到这一点: int bit_return(int a, int loc) // Bit returned at location { int buf = a & 1<<loc; if (buf == 0) return 0; else return 1; } 如果我用float a替换int a ,编译器将无法编译。 这有解决方案吗? 复制并重新格式化您的评论如下 好的,对于不清楚的人,我在这里发布我的整个代码: #include #include int bit_return(int a, int loc) // Bit returned at location { int buf = a & 1<=0; […]

您如何计算浮点数中设置的位数?

如何使用C函数计算浮点数中设置的位数?

x86-64长双精度

在英特尔64位平台上,long double的实际精度是多少? 是80位填充到128或实际128位? 如果是前者,除了去gmp之外,还有其他选择来实现真正的128精度吗?

C IEEE-Floats inf等于inf

在C中,在使用IEEE-754浮点数的实现中,当我比较两个NaN的浮点数时,它返回0或“false”。 但是为什么两个浮点数都相等呢? 本程序打印“相等:……”(至少在Linux AMD64下使用gcc),在我看来它应该打印“不同:……”。 #include #include int main(void) { volatile double a = 1e200; //use volatile to suppress compiler warnings volatile double b = 3e200; volatile double c = 1e200; double resA = a * c; //resA and resB should by inf double resB = b * c; if (resA == resB) { printf(“equal: %e […]

将float转换为unsigned long以访问c #define中的float内部

我想将float转换为unsigned long ,同时保持float的二进制表示(所以我不想将5.0为5 !)。 这很容易通过以下方式完成: float f = 2.0; unsigned long x = *((unsigned long*)&f) 但是,现在我需要在#define做同样的事情,因为我想稍后在一些数组初始化中使用它(所以[inline]函数不是一个选项)。 这不编译: #define f2u(f) *((unsigned long*)&f) 如果我这样称呼它: unsigned long x[] = { f2u(1.0), f2u(2.0), f2u(3.0), … } 我得到的错误是(逻辑上): lvalue required as unary ‘&’ operand 注意:下面建议的一个解决方案是为我的数组使用union类型。 但是,这没有选择。 我实际上在做以下事情: #define Calc(x) (((x & 0x7F800000) >> 23) – 127) unsigned long x[] = […]