Tag: 浮动精度

C浮点和双重比较

我在比较C中的简单浮点数和双精度数,特别是两者的值8.7。 现在我为每个变量分配8.7,当我打印时,我得到两个值的8.7000的结果。 为什么编译器添加了这些零。 我想问的主要问题是还有任何我没有看到的数字,如隐藏在尾随零之后的数字。 我读到由于缺乏精确度,我不应该使用float进行这样的比较,但是我认为它具有如此小的值,它确实可以存储8.7,并且需要一定程度的精确度来与另一个8.7值进行比较? 我唯一担心的是它实际上是在内存中的某个位置表示为例如8.70000003758或其他东西,这会让我的比较失败? 我试图使用%.20f打印f以查看可能隐藏的任何其他数字,但我认为只是创建了数字,否则不存在,因为数字的整体精确度变为8.6918734634834929或类似的东西。

C中的浮点舍入

我用浮动遇到了一些奇怪的舍入行为。 下面的代码演示了这个问题。 解决这个问题的最佳方法是什么? 我一直在寻找解决方案,但没有太多运气。 #include int main(void) { float t; t = 5592411; printf(“%f\n”, 1.5*t); t *= 1.5; printf(“%f\n”, t); return 0; } 上面的代码应打印出相同的值,但我使用GCC 4.7.2在我的设置上得到了这个: 8388616.500000 8388616.000000 如果我使用计算器,我得到第一个值,所以我假设第二个值是以某种方式舍入。 我有相同的Fortran代码,它不会对值进行舍入(具有0.5)。

精确损失从浮动到双重,从双重到浮动?

float fv = orginal_value; // original_value may be any float value … double dv = (double)fv; … fv = (float)dv; 应该fv完全等于original_value吗? 任何精度都可能丢失?

用整数除以double

我在将double与int分开时面临一个问题。 代码段是: double db = 10; int fac = 100; double res = db / fac; res的值是0.10000000000000001而不是0.10 。 有谁知道这是什么原因? 我正在使用cc来编译代码。

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

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

对于某些正整数n,m,will(int)pow(n,m)是错误的吗?

假设n和m是正整数,并且n m在整数范围内,那么(int)pow(n,m)给出错误的答案吗? 我为m=2尝试了很多n ,到目前为止还没有得到任何错误的答案。

为什么我需要17位有效数字(而不是16位)才能代表双倍数字?

有人能给我一个浮点数(双精度)的例子,需要超过16位有效十进制数来表示它吗? 我在这个post中发现有时候你需要多达17位,但是我找不到这样一个数字的例子(16对我来说似乎足够了)。 有人可以澄清一下吗? 非常感谢!

C的pow()函数根据头文件无法正常工作

我看到以下代码生成如下结果,任何关于为什么输出都是这样的想法? #include #include int main() { int i = 0; for(i = 0; i < 10; i++) { printf("%d\t\t\t%d\t\t\t", i, (int)pow(10, i)); printf("%f\n", pow(10, i)); } return 0; } 输出: 0 1 1.000000 1 10 10.000000 2 99 100.000000 3 1000 1000.000000 4 9999 10000.000000 5 100000 100000.000000 6 1000000 1000000.000000 7 9999999 10000000.000000 8 […]

浮点格式会受big-endian和little endian的影响吗?

我知道big-endian机器和little-endian机器之间的整数格式会有所不同,浮点格式(IEEE 754)是否相同?