Tag: 数学

在C中避免使用置换(nPr,nCr)函数的整数溢出

我试图做一些与统计相关的function,所以我可以执行一些相关的程序(即:概率的统计计算,生成任意深度的Pascal三角形等)。 我遇到了一个问题,我可能会遇到溢出问题。 例如,如果我想计算nPr(n = 30,p = 1),我知道我可以将它减少到: 30P1 = 30! / (30 – 1)! = 30! / (29)! = 30! / 29! = 30 但是,在使用下面的函数进行计算时,由于整数溢出,我看起来总是会得到无效值。 是否有任何变通方法不需要使用库来支持任意大数字? 我已经在其他关于伽玛函数的post中读过一些内容,但找不到具体的例子。 int factorial(int n) { return (n == 1 || n == 0) ? 1 : factorial(n – 1) * n; } int nCr(int n, int r) { return […]

计算浮点数的位数

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

C中的斐波纳契数列

这是预期的输出: 替代文字http://sofzh.miximages.com/c/f1lfuh.jpg 我们要制作一个计算Fibonacci序列的C程序。 我们最多只允许3个变量,我们不允许使用循环。 而且我不知道该怎么做以及如何开始。 我希望你们能帮助我。 :/

Objective-C整数算术

我正在尝试计算iPhone应用程序中的一些数字。 int i = 12; int o = (60 / (i * 50)) * 1000; 我希望在这个例子中o为100(即毫秒),但它等于0,由NSLog(@“%d”,o)显示。 这也等于0。 int o = 60 / (i * 50) * 1000; 这相当于250,000,这是从左到右的直接数学。 int o = 60 / i * 50 * 1000; 什么在我头顶飞过? 谢谢, 缺口

整数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) + […]

如何在OS X上强制使用64位整数运算?

我试图在OS X 10.5.6上强制64位长整数。 在Apple MacBook Intel Core 2 Duo上运行。 这是我的c代码: #include int main() { long a = 2147483647; /*== 2^32 – 1*/ long aplus1; printf(“a== %d. sizeof(a) == %d \n”, a, sizeof(a)); aplus1 = a+1; printf(“aplus1 = %d \n”, aplus1); } 没有任何开关进行编译会产生以下结果: $ gcc testlong.c -o testlong ;./testlong a== 2147483647. sizeof(a) == 4 aplus1 = […]

C – 计算一系列数字组合的简单表达式?

真的是一个模糊的陈述(对我来说) 要计算的基本表达式是什么: “n个事物的组合数量,每次k为整数” 编辑:更多澄清:“例如,a,b,c,d一次采取三个项目的组合是abc,abd,acd和bcd。换句话说,总共有四种不同的组合四件事“一次三个”。“ 我正在学习一门非入门级的C课,同时试图完成我的数学要求以转学为CS学位。 到目前为止,我的所有工作都获得了很高的分数,但是当更高级别的数学出现时,我真的陷入困境。 但我离题了…… 对于n ,数字的范围是1-10,而k的范围是1-4。 以下是我收到的唯一参考资料,这是我的头脑。 http://www.themathpage.com/aPreCalc/permutations-combinations-2.htm

检查数字的逻辑可以被3整除吗?

不使用%,/或*,我必须找到否。 可以被3整除吗? 这可能是一个面试问题。 谢谢。

小端或大端

#include union Endian { int i; char c[sizeof(int)]; }; int main(int argc, char *argv[]) { union Endian e; ei = 1; printf(“%d \n”,&e.i); printf(“%d,%d,\n”,ec[0],&(ec[0])); printf(“%d,%d”,ec[sizeof(int)-1],&(ec[sizeof(int)-1])); } OUTPUT: 1567599464 1,1567599464, 0,1567599467 LSB存储在较低地址中,MSB存储在较高地址中。 这不应该是大端吗? 但我的系统配置显示它是一个小端架构。

使用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中公开。 这导致以下版本: […]