Tag: 浮点

C浮子的精度

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

如果你不合理,那么会发生什么?

我假设这只返回一个int。 还有什么事情我应该知道吗? C / C ++的差异? float a = 2.5; !a; // What does this return? Int? Float?

印花浮子,保持精度

我正在编写一个打印浮点文字的程序,以便在另一个程序中使用。 我需要打印多少位数才能保持原始浮点的精度? 由于浮点数具有24 * (log(2) / log(10)) = 7.2247199精度的十进制数字,我最初的想法是打印8位数就足够了。 但是,如果我运气不好,那些0.2247199会分配到7位有效数字的左侧和右侧,所以我应该打印9位小数。 我的分析是否正确? 所有情况下都是9位十进制数字吗? 像printf(“%.9g”, x); ? 是否有标准函数将float转换为具有该值所需的最小小数位数的字符串,在7或8足够的情况下,所以我不打印不必要的数字? 注意:我不能使用hex浮点文字,因为标准C ++不支持它们。

__STDC_IEC_559__与现代C编译器的状态

C99添加了一个宏__STDC_IEC_559__ ,可用于测试编译器和标准库是否符合ISO / IEC / IEEE 60559(或IEEE 754)标准。 根据这个问题的答案 如何检查 – ieee-754-单精度-32位浮点表示大多数C编译器不设置预处理器宏__STDC_IEC_559__ 。 根据GCC的文档,它没有定义__STDC_IEC_559__ 。 我用GCC 4.9.2和Clang 3.6.0测试了这两个,使用glibc 2.21使用以下代码。 //test.c //#include int main(void) { #if defined ( __STDC_IEC_559__ ) //#if defined ( __GCC_IEC_559__ ) return 1; #else return 0; #endif } 然后 echo $? 这表明使用此代码__STDC_IEC_559__是使用GCC定义的,而不是使用Clang定义的。 然后我做了gcc -E ,它显示了包含文件stdc-predef.h 。 该文件定义__STDC_IEC_559__ 。 /* glibc’s intent is […]

限制浮点精度?

有没有办法将浮点数舍入为2分? 例如: 3576.7675745342556变为3576.76 。

matlab和c与cos函数不同

我有一个在matlab中实现的程序和c中的相同程序,结果不同。 我有点困惑的是cos函数没有返回完全相同的结果。 在这两种情况下,我使用相同的计算机,Intel Core 2 Duo和8字节双数据类型。 为什么结果不同? 这是测试: c: double a = 2.89308776595231886830; double b = cos(a); printf(“a = %.50f\n”, a); printf(“b = %.50f\n”, b); printf(“sizeof(a): %ld\n”, sizeof(a)); printf(“sizeof(b): %ld\n”, sizeof(b)); a = 2.89308776595231886830106304842047393321990966796875 b = -0.96928123535654842068964853751822374761104583740234 sizeof(a): 8 sizeof(b): 8 matlab: a = 2.89308776595231886830 b = cos(a); fprintf(‘a = %.50f\n’, a); fprintf(‘b = %.50f\n’, […]

浮点数和双变量的比较

可能重复: float和double之间的区别 float与float文字的比较中的奇怪输出 我正在使用visual C ++ 6.0,在程序中我比较float和double变量例如这个程序 #include int main() { float a = 0.7f; double b = 0.7; printf(“%d %d %d”,ab,a==b); return 0; } 我得到1 0 0作为输出 并为 #include int main() { float a = 1.7f; double b = 1.7; printf(“%d %d %d”,ab,a==b); return 0; } 我输出0 0 0。 请告诉我为什么我得到这些奇怪的输出,有没有办法在同一个处理器上预测这些输出。 如何比较C中的两个变量?

sin,cos,tan和舍入误差

我正在用C / C ++进行一些三角计算,并且遇到了舍入错误的问题。 例如,在我的Linux系统上: #include #include int main(int argc, char *argv[]) { printf(“%e\n”, sin(M_PI)); return 0; } 该程序提供以下输出: 1.224647e-16 当正确的答案当然是0。 使用trig函数时,我可以期待多少舍入误差? 我怎样才能最好地处理这个错误? 我熟悉用于比较浮点数的最后位置单位技术,来自Bruce Dawson的比较浮点数 ,但这似乎在这里不起作用,因为0和1.22e-16相当于几个ULP。

检查双倍是否可以被C中的另一个双倍整除?

如何检查双x是否可以被C中的另一个双y整除? 使用整数我只会使用模数,但是用双精度执行它的正确/最佳方法是什么? 我知道浮点数带有不精确性,但我从标准输入得到了双倍。 也许我不应该直接扫描它,而是将其作为两个整数扫描,但是从那时起我会去哪里?

编译器之间的浮点不匹配(Visual Studio 2010和GCC)

我正在努力解决一个正在出现的跨平台问题,我不确定如何解决这个问题。 这是一个演示程序: #include #include int main() { int xm = 0x3f18492a; float x = *(float*)&xm; x = (sqrt(x) + 1) / 2.0f; printf(“%f %x\n”, x, *(int*)&x); } 在VS2010中编译时,Windows上的输出是: 0.885638 3f62b92a 使用GCC 4.8.1 (ideone.com示例)编译时的输出是: 0.885638 3f62b92b 在需要在多个平台上以相同方式运行的程序过程中,这些小的不匹配最终会成为一个严重的问题。 我并不太关心“准确性”,因为结果相互匹配 。 我尝试将VS中的/fp模式从precise切换到strict ,但这似乎并没有解决它。 我应该考虑采用哪些其他途径来进行此计算,在两个平台上都有相同的结果? 更新 :有趣的是,如果我更改这样的代码,它会跨平台匹配: #include #include int main() { int xm = 0x3f18492a; float x = […]