Tag: 浮点数

无效的静态断言行为

我正在尝试使用GCC v4.3.x设置静态断言(在main函数之外): #define STATIC_ASSERT(cond) extern void static_assert(int arg[(cond) ? 1 : -1]) STATIC_ASSERT( (double)1 == (double)1 ); // failed 但是当我使用浮点数时,断言总是失败。 是否可以正确运行此静态断言?

用于搜索arrays中的3D坐标的高效算法

我有一个大的数组(> 10 ^ 5个条目)的3D坐标r =(x,y,z),其中x,y和z是浮点数。 这是搜索数组中给定坐标r’并给出数组索引的最有效方法。 注意,r’可能没有给出与r相同的精度; 比方说,如果数组存储坐标(1.5,0.5,0.0)并且r’给出为(1.49999,0.49999,0.0),则算法应该正确地选择坐标。 我正在用C开发代码。 为此目的,如何使用哈希表的O(1)搜索function? 由于与准确性相关的问题,将坐标转换为字符串是不可能的。 是否有任何特定的数据结构有助于O(1)算法? 谢谢 OnRoadCoder

在所有平台和处理器架构中,从float到int的转换是否一致?

我正在研究一种依赖于所谓的“浮点确定性”的多人游戏,换句话说,所有计算的结果必须与运行游戏的每个人完全相同。 这实质上意味着不使用IEEE 754浮点,因为操作可能会导致不同的值,具体取决于舍入模式,使用的融合乘法 – 加法或反平方根指令,不同的libc实现等。 所以我已经去了所有基本算术运算甚至一些超越函数的定点版本。 但是我还是想使用浮点文字来配置游戏变量。 在这样做时,我最终得到一些看起来像这样的代码,从浮点转换到固定点: explicit NetFixedPoint(float val) { static const StorageType kOne = StorageType(1) << FractionalBits; m_Value = ((StorageType)(val * kOne)); } 这会在所有平台和处理器架构中给出相同的结果吗?

如何在变量内设置浮点精度

我目前正在编写一个程序,我需要在浮点后计算舍入值到2位数。 说,我已经宣布了 float a; 如果a = 3.555那么它将存储a = 3.56 ,向上舍入。 对于a = 3.423 ,a的值将是a = 3.423 ,没有变化。 我可以这样做来打印输出,但是在将它存储到变量中并将该变量用于其他计算时我需要做什么?

cosf(M_PI_2)不返回零

今天早上突然开始。 这是原创的 float angle = (x+90)*(M_PI/180.0); float xx = cosf(angle); float yy = sinf(angle); 放入断点并hover光标后..我得到yy的正确答案为1.但xx不为零。 我尝试过cosf(M_PI_2); 仍然没有运气..它工作正常,直到昨天..我没有改变任何编译器设置等.. 我正在使用截至今天的Xcode最新版本

浮点计算根据编译器而变化

当我运行完全相同的代码执行在Windows和Solaris上编译的完全相同的浮点计算(使用双精度)时,我得到的结果略有不同。 我知道由于舍入错误导致结果不准确。 但是我希望舍入错误与平台无关,从而在两个平台上给出相同(略微不正确)的结果,但事实并非如此。 这是正常的,还是我的代码中还有其他问题?

math.h ceil在C中没有按预期工作

为什么ceil()会在没有分数部分的情况下进行均匀浮动? 当我尝试这样做时: double x = 2.22; x *= 100; //which becomes 222.00… printf(“%lf”, ceil(x)); //prints 223.00… (?) 但是当我将2.22的值更改为2.21时 x *= 100; //which becomes 221.00… printf(“%lf”, ceil(x)); //prints 221.00… as expected 我尝试用另一种方式使用modf()并遇到另一个奇怪的事情: double x = 2.22 * 100; double num, fraction; fraction = modf(x, &num); if(fraction > 0) num += 1; //goes inside here even when […]

计算浮点数的位数

是否有任何有效的方法(不将float转换为字符串)以获得浮点数组成的位数(与其长度和精度无关)? 通过这种方式,我可以通过将float乘以它所包含的位数来实现一个相当好的,可移植的,无问题的函数来进行比较/调节。

整数sqrt的准确性

我有一个像这样的循环: for(uint64_t i=0; i*i<n; i++) { 这需要每次迭代进行乘法运算。 如果我可以在循环之前计算sqrt,那么我可以避免这种情况。 unsigned cut = sqrt(n) for(uint64_t i=0; i<cut; i++) { 在我的情况下,如果sqrt函数向下舍入到下一个整数是没关系的,但如果它向下舍入则不行。 我的问题是:对于所有情况,sqrt函数是否足够准确? 编辑:让我列出一些案例。 如果n是一个完美的正方形,那么n = y^2我的问题是 – 是cut=sqrt(n)>=y对于所有n? 如果cut = y-1则存在问题。 例如,如果n = 120并且cut = 10则没关系,但如果n = 121(11 ^ 2)并且cut仍然是10则那么它将不起作用。 我首先关注的是浮点数的小数部分只有23位和双52,因此它们不能存储某些32位或64位整数的所有数字。 但是,我不认为这是一个问题。 假设我们想要一些y的sqrt,但是我们不能存储y的所有数字。 如果我们将y的分数保存为x,我们可以写y = x + dx然后我们要确保无论我们选择什么dx都不会将我们移动到下一个整数。 sqrt(x+dx) < sqrt(x) + 1 //solve dx < 2*sqrt(x) + […]

使用C标准数学库精确计算标准正态分布的CDF

标准C数学库不提供计算标准正态分布的CDF函数normcdf() 。 但它确实提供了密切相关的函数:错误函数erf()和补充错误函数erfc() 。 计算CDF的最快方法通常是通过误差函数,使用预定义的常量M_SQRT1_2来表示√½: double normcdf (double a) { return 0.5 + 0.5 * erf (M_SQRT1_2 * a); } 显然,这在负半平面中遭受大量的减法消除,并且不适合大多数应用。 由于使用erfc()可以很容易地避免取消问题,但是erf()性能通常比erf()低一些,因此最常推荐的计算是: double normcdf (double a) { return 0.5 * erfc (-M_SQRT1_2 * a); } 一些测试表明,在负半平面中产生的最大ulp误差仍然相当大。 使用精确到0.51 ulps的erfc()的双精度实现,可以在normcdf()观察到高达1705.44 ulps的误差。 这里的问题是erfc()输入中的计算误差被erfc()固有的指数缩放放大(有关由取幂引起的误差放大的解释,请参阅此答案 )。 下面的文章展示了当浮点操作数与任意精度常数(如√½)相乘时,如何实现(几乎)正确舍入的产品: Nicolas Brisebarre和Jean-Michel Muller,“正确舍入乘以任意精度常数”, IEEE Transactions on Computers ,Vol。 57,第2期,2008年2月,第165-174页 本文提倡的方法依赖于融合乘法 – 加法运算,该运算可用于所有常见处理器体系结构的最新实现,并通过标准数学函数fma()在C中公开。 这导致以下版本: […]