Tag: math

确定范围是否重叠

给定具有整数开始和结束时间的两个事件,E1 =(s1,e1),E2 =(s2,e2),实现快速布尔检查以查看事件是否重叠。 我有解决方案,但我很想知道其他人想出了什么。 编辑:好的,这是我的解决方案: e1 > s2 || (s1 > s2 && e2 < s1)

数学函数在现代处理器上花费了多少周期

我们知道现代处理器直接在处理器上执行诸如cosine和sin指令,因为它们具有操作码。 我的问题是这些指令通常需要多长时间。 他们是否需要恒定时间或依赖输入参数?

为什么stdlib.h的abs()系列函数返回有符号值?

手册中注明了这种负面含义: 注意未定义尝试取最负整数的绝对值。 这背后的原因是什么?对于想要避免未定义行为的人来说,最好的办法是什么? 我是否必须采取以下措施: unsigned uabs(signed val) { return val > 0 ? val : (val == 1U << ((sizeof(val) * 8) – 1)) ? -1U : -val; } (故意hacky强调对stdlib的不满;-) 例 假设您有一个4位有符号值(为了便于理解)。 unsigned max是15,signed(正)max是7,signed(负)min是-8,所以abs(-8)不适合有符号值。 当然,您可以将其表示为-8,但随后对结果进行除法和乘法不会按预期工作。

对Goldschmidt部门进行良好的初步估计

我正在使用Goldschmidt部门在Q22.10中计算固定点倒数,用于ARM上的软件光栅化器。 这是通过将分子设置为1来完成的,即分子成为第一次迭代的标量。 说实话,我在这里盲目地遵循维基百科算法。 文章说,如果分母在半开范围内缩放(0.5,1.0),那么良好的初步估计可以仅基于分母:设F为估计标量,D为分母,则F = 2 – D. 但是当这样做时,我会失去很多精确度。 如果我想找到512.00002f的倒数。 为了缩小数字,我在分数部分失去了10位精度,它被移出。 所以,我的问题是: 有没有办法选择一个不需要标准化的更好估计? 为什么? 为什么不? 为什么这是或不可能的数学certificate将是伟大的。 此外,是否可以预先计算第一个估计值,以便系列收敛得更快? 现在,它平均在第4次迭代后收敛。 在ARM上,这是大约50个周期的最坏情况,并且没有考虑到clz / bsr的仿真,也没有考虑内存查找。 如果可能的话,我想知道这样做是否会增加错误,以及增加多少错误。 这是我的测试用例。 注意:第13行的clz的软件实现来自我的post。 如果需要,可以用内在替换它。 clz应返回前导零的数量,并返回值32的32。 #include #include const unsigned int BASE = 22ULL; static unsigned int divfp(unsigned int val, int* iter) { /* Numerator, denominator, estimate scalar and previous denominator */ unsigned long long […]

为什么在这个C代码中使用的IEEE-754指数偏差是126.94269504而不是127?

以下C函数来自fastapprox项目。 static inline float fasterlog2 (float x) { union { float f; uint32_t i; } vx = { x }; float y = vx.i; y *= 1.1920928955078125e-7f; return y – 126.94269504f; } 有些专家可以解释一下为什么上面代码中使用的指数偏差是126.94269504而不是127? 是否更准确的偏差值?

未定义的引用`log’

我正在尝试编译Donald Eastlake的RFC 3797随机选择算法的实现(代码: http : //kambing.ui.ac.id/minix/other/rfc3797/ )。 但是,我收到链接器错误: rfc3797.c:(.text+0xe7f): undefined reference to `log’ 我试图用提供的Makefile来实现它,它明确地链接到数学图书馆,但我仍然得到错误: cc -lm -o randomselection rfc3797.c MD5.c 我该如何编译这个程序?

在PIC上使用long long时的舍入问题

我在PIC单片机上做了一些简单的数学运算,在C中运行代码并使用MPLABX和xc16编译器。 这是代码: double mydouble = 0.019440; long long int mypower = 281474976710656; long long int result = mypower*mydouble; 打印出’结果’给了我5,471,873,794,048; 而它应该给5,471,873,547,255。 知道是什么导致了这个问题,我怎么能纠正它? 谢谢

什么是第一个双倍偏离相应的长三角?

我想知道从0d向上的第一个双重偏离“相同值”的长度偏离一些增量,比如1e-8。 我虽然失败了。 我试图在C中做这个,虽然我通常使用托管语言,以防万一。 请帮忙。 #include #include #define DELTA 1e-8 int main() { double d = 0; // checked, the literal is fine long i; for (i = 0L; i DELTA || di < -DELTA) { printf("%f", d); break; } } } 我猜测问题是di将我加倍并且因此d == i然后差异总是为0.我还能如何正确地检测到这一点 – 我更喜欢有趣的C铸造而不是比较字符串,这会永远。 答案 :完全符合我们的预期。 根据标准C / UNIX / POSIX工具,2 ^ 53 […]

sin中的sin v / s sinf函数

我试图在我的C程序中使用sinf函数,但它在MSVC 6.0下给我一个未定义的引用错误,但是sin工作正常。 这让我很好奇地发现sin与sin之间的区别。 sin和sinf之间的逻辑区别是什么? 我怎样才能实现自己的sinffunction?

计算没有std函数或C99的atan2

我正在计算3轴加速度计的角度,但我的编译器没有atan或atan2function。 它有一个保留的内存插槽,但它调用了一个我在任何文件中都找不到的function。 我的编译器是运行ARMCC编译器的KeilμVision4。 编译有文件math.h,但函数是extern并且不存在: extern _ARMABI double atan2(double /*y*/, double /*x*/); 是否有我可以包含的lib或函数,它具有arctan函数的实现? 或者是否有另一种function来计算加速度计的角度? 我需要完整的3轴角度校准。 编辑:我希望避免一个充满预先计算值的表格。