Tag: 精度

C / C ++中sqrt函数的保证精度

每个人都知道C / C ++中math.h / cmath sqrt函数 – 它返回其参数的平方根。 当然,它必须有一些错误,因为不是每个数字都可以精确存储。 但我保证结果有一定的精确度吗? 例如,’它是可以用浮点类型表示的平方根的最佳近似值, or如果计算结果的平方,它将使用给定的浮点类型尽可能接近初始参数? C / C ++标准有什么关于它的吗?

Python和/或C / C ++中的高精度算术?

摘要:哪种Python包或C-Library是高精度算术运算的最佳选择? 我有一些函数可以将小数天( 0.0-0.99999.. )转换为人类0.0-0.99999..格式(小时,分钟,秒;但更重要的是:毫秒,微秒,纳秒)。 转换是通过以下function完成的:(请注意,我还没有实现时区校正) d = lambda x: decimal.Decimal(str(x)) cdef object fractional2hms(double fractional, double timezone): cdef object total, hms, ms_mult cdef int i hms = [0,0,0,0,0,0] ms_mult = (d(3600000000000), d(60000000000), d(1000000000), d(1000000), d(1000), d(1)) # hms = [0,0,0,0,0] total = d(fractional) * d(86400000000000) for i in range(len(ms_mult)): hms[i] = (total – (total % ms_mult[i])) […]

比较相同的浮点数时奇怪的输出?

比较C中的相同浮点值 与float和float文字相比较的奇怪输出 浮动添加提升到双倍? 我在浮点上阅读了上面的链接,但是甚至得到了奇怪的输出。 #include int main() { float x = 0.5; if (x == 0.5) printf(“IF”); else if (x == 0.5f) printf(“ELSE IF”); else printf(“ELSE”); } 现在,根据促销规则,不应该打印“ ELSE IF ”吗? 但是,这里是打印“ IF ” 编辑:是因为0.5 = 0.1二进制,之后一切都为0,精度损失因此没有影响,因此比较IF返回true。 如果它是0.1,0.2,0.3,0.4,0.6,0.7 ……,则Else If块返回true。 请原谅我提出同样的问题,因为我已经从上面的链接中读到,浮动比较绝对不能完成。 但是,这种意外行为的原因是什么?

如何在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 […]

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

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

为什么即使我使用浮子,5/2也会产生’2’?

我输入了以下代码(没有编译问题或任何东西): float y = 5/2; printf(“%f\n”, y); 输出只是: 2.00000 我的数学没错,是吗? 或者我错了/运营商? 这意味着鸿沟不是吗? 5/2应该等于2.5? 任何帮助是极大的赞赏!

32位十进制数的浮点/双精度分析

从另一个人的.c文件中,我看到了这个: const float c = 0.70710678118654752440084436210485f; 他想避免计算sqrt(1/2) 。 这可以用普通的C/C++以某种方式存储吗? 我的意思是没有失去精确度。 对我来说似乎不可能。 我正在使用C ++,但我不相信这两种语言之间的精确差异太大(如果有的话),那就是为什么我没有测试它。 所以,我写了几行,看看代码的行为: std::cout << "Number: 0.70710678118654752440084436210485\n"; const float f = 0.70710678118654752440084436210485f; std::cout << "float: " << std::setprecision(32) << f << std::endl; const double d = 0.70710678118654752440084436210485; // no f extension std::cout << "double: " << std::setprecision(32) << d << std::endl; const double df […]

如果可以用IEEE 754中的二进制格式表示硬编码是否精确浮动?

例如,0,0.5,0.15625,1,2,3 ……是从IEEE 754转换而来的值。它们的硬编码版本是否精确? 例如: 是 float a=0; if(a==0){ return true; } 总是回归真实? 其他例子: float a=0.5; float b=0.25; float c=0.125; a * b总是等于0.125而a * b == c总是如此? 还有一个例子: int a=123; float b=0.5; a * b总是61.5? 或者一般来说,整数乘以IEEE 754二进制浮点精确? 或者更一般的问题:如果值是硬编码,并且值和结果都可以用IEEE 754中的二进制格式表示(例如:0.5 – 0.125),那么值是否准确?

存储和打印大于2 ^ 64的整数值

我正在尝试编写一个程序来查找mersenne素数。 使用无符号长long类型,我能够确定第9个mersenne prime的值,即(2 ^ 61)-1。 对于更大的值,我需要一种可以存储大于2 ^ 64的整数值的数据类型。 请帮忙。 (我应该能够使用这种数据类型的运算符,如, =,>,<和%。)

C浮子的精度

通常我们说浮点数在小数点后的精度为6位数。 但是如果我们存储大量的10 ^ 30的数量,我们将不会得到小数点后的6位数。 那么浮点数在小数点后的精度为6位是否正确?