Tag: 浮点

如何在C中使用逐位和逻辑运算符将无符号数转换四倍

目标: 4x ( 4.400000095 ) = 17.60000038 合法操作:任何整数/未签名操作,包括。 ||,&&。 如果,同时 Max ops:30 返回表达式x + x + x + x的位级等价物 浮点参数f。 我的代码: unsigned 4x(unsigned uf) { unsigned expn = (uf >> 23) & 0xFF; unsigned sign = uf & 0x80000000; unsigned frac = uf & 0x007FFFFF; if (expn == 255 || (expn == 0 && frac […]

在C中翻转双/浮点符号的最快方法

在C中翻转双(或浮点)符号的最快方法是什么? 我想,直接访问符号位将是最快的方法,并找到以下内容: double a = 5.0; *(__int64*)&a |= 0x8000000000000000; // a = -5.0 float b = 3.0; *(int*)&b |= 0x80000000; // b = -3.0 但是,上述内容不适用于负数: double a = -5.0; *(__int64*)&a |= 0x8000000000000000; // a = -5.0

你如何找到浮点数最接近的非等值?

float (aka single)值是一个4字节的值,应该表示任何实数值。 由于它的格式化方式和有限的字节数,它有一个最小值和一个可以表示的最大值,并且它具有有限的精度,具体取决于它自己的值。 我想知道是否有一种方法可以获得高于或低于某个参考值的最接近的可能值,给定浮点数的有限精度。 对于整数,这是微不足道的:一个简单地添加或减去1.但是使用float ,您不能简单地添加或减去最小浮点值并期望它与原始值不同。 即 float FindNearestSmaller (const float a) { return a – FLT_MIN; /* This doesn’t necessarily work */ } 事实上,上述几乎永远不会奏效。 在上面的例子中,返回通常仍然等于a ,因为FLT_MIN远远超出a的精度。 您可以轻松地自己尝试:它适用于例如0.0f或非常少量的订单FLT_MIN ,但不适用于0到100之间的任何数据。 那么在给定浮点精度a ,如何获得最接近但小于或大于a值? 注意:虽然我主要对C / C ++答案感兴趣,但我认为答案适用于大多数编程语言。

最快的算法,用于识别制作双精度方程x + a == b true的最小和最大x

在静态分析的上下文中,我感兴趣的是在以下条件的then-branch中确定x的值: double x; x = …; if (x + a == b) { … a和b可以假设为双精度常量(推广到任意表达式是问题中最容易的部分),并且可以假设编译器严格遵循IEEE 754( FLT_EVAL_METHOD为0)。 运行时的舍入模式可以假设为最接近均匀。 如果用有理数计算是便宜的,那就很简单: x的值将是理性区间中包含的双精度数(b – a – 0.5 * ulp1(b)… b – a + 0.5 * ulp2(b) )。 如果b是偶数,则应该包括边界,如果b是奇数则排除,并且ulp1和ulp2是两个稍微不同的“ULP”定义,如果不介意在2的幂上失去一点精度,则可以采用相同的定义。 不幸的是,使用有理数的计算可能很昂贵。 考虑另一种可能性是通过二分法获得每个边界,在64个双精度加法中(每个操作决定结果的一位)。 获得下限和上限的128个浮点加法可能比基于数学的任何解更快。 我想知道是否有办法改进“128浮点添加”的想法。 实际上我有自己的解决方案,包括更改舍入模式和nextafter调用,但我不想吝啬任何人的风格,并使他们错过比我现有的更优雅的解决方案。 另外我不确定两次更改舍入模式实际上比64个浮点加法更便宜。

浮点exception

我成功编写了这段代码: #include #include int q; int main() { srand( time(NULL) ); int n=3; q=ceil(sqrt(n)); printf(“%d\n %d\n”, n,q); if(n == 2) printf(“%d\n is prime”, n); else if(n % 2 == 0.0 || n < 2) printf("%d\n is not prime", n); else { int x; for(x = 0; x < q; x++){ if(n % x == 0) […]

IEEE754浮点值的便携式序列化

我最近一直致力于一个需要存储和加载大量数据的系统,包括单精度浮点值。 我决定标准化整数的网络字节顺序,并决定以big-endian格式存储浮点值,即: |– Byte 0 –| |– Byte 1 -| Byte 2 Byte 3 # ####### # ####### ######## ######## Sign Exponent Mantissa 1b 8b, MSB first 23b, MSB first 理想情况下,我想提供像htonl()和ntohl()这样的函数,因为我已经使用它们来擦除整数,我也希望以尽可能多的平台独立性的方式实现它(同时假设float类型对应于IEEE754 32位浮点值)。 有没有办法,可能使用ieee754.h ,这样做? 我有一个似乎有效的答案,我将在下面发布,但它似乎非常缓慢和低效,我将不胜感激任何有关如何使其更快和/或更可靠的建议。

为什么pow(-infinity,正非整数)+无限?

C99附件F(IEEE浮点支持)说: 对于y> 0而言, pow(−∞, y)返回+∞而不是奇数。 但是,比方说,( – ∞) 0.5实际上有虚数值±∞i,而不是+∞。 C99自己的sqrt(−∞)返回NaN并按预期生成域错误。 那么为什么需要返回+∞? (大多数其他语言直接使用C库,或者像本例中的Python一样,通过标准复制它所需的行为,因此在实践中这不仅仅影响C99。)

C中的NaN Literal?

你如何在C中编写NaN浮点字面值?

为什么MSVS不能优化+0?

这个问题展示了一个非常有趣的现象: 非规范化浮点数使代码减慢了一个数量级以上。 在接受的答案中很好地解释了这种行为。 但是,有一条评论,目前有48条评论,我找不到满意的答案: 在这种情况下,为什么编译器不会丢弃+/- 0? – 迈克尔多根 旁注:我的印象是0f是/必须是完全可表示的(此外 – 它的二进制表示必须全为零),但在c11标准中找不到这样的声明。 certificate这一点的引用或反驳这一主张的论点将是最受欢迎的。 无论如何, 迈克尔的问题是这里的主要问题。 §5.2.4.2.2 实现可以给零和不是浮点数(例如无穷大和NaN)的值作为符号或者可以使它们无符号。

为什么double可以存储比unsigned long long更大的数字?

问题是,我不太清楚为什么double可以存储比unsigned long long更大的数字。 由于它们都是8字节长,所以64位。 在无符号长long中,所有64位用于存储值,另一方面double表示1表示,11表示指数,52表示尾数。 即使用于尾数的52位将用于存储没有浮点的十进制数,它仍然有63位…… 但LLONG_MAX明显小于DBL_MAX …… 为什么?