C++ 浮点数
在 C 中有以下 3 种数据类型可以表示浮点数分别是 float、double 和 long double。float 数据类型被认为是单精度。double 数据类型通常是 float 的两倍大小因此被认为是双精度。顾名思义long double 数据类型又比 double 要大。这些数据类型的确切大小取决于当前使用的计算机。唯一可以保证的是double 至少与 float 一样大。long double 至少与 double一样大。数据类型关键字大小范 围有效数字单精度float4字节数字介于 ±3.4E-38 和 ±3.4E38 之间7或双精度double8字节数字介于 ±1.7E-308 和 ±1.7E308 之间15或16高双精度long double8字节数字介于 ±1.7E-308 和 ±1.7E308 之间16或161. 有效数字的位数也就是说对于double第16位有效数字是不可信的那么第15位就是可信的吗看下面的例子double a 1e-20; std::cout a is std::setprecision(30) a std::endl;输出9.9999999999999994515327145421e-21也就是说存储的值与真实真的差小于1e-152. 类型强转double a 1506223285.61999999; uint64_t b static_castuint64_t(a * 100); std::cout a is std::setprecision(30) a std::endl; std::cout b is b std::endl;输出a is 1506223285.61999988555908203125 b is 150622328562虽然类型强转是进行截断但a有可能存储的就是1506223285.62所以很在意精度的时候最好不要用这种类型强转而是使用四舍五入再强转以上是个人的一些理解如有错误感谢指正。3. nannan的意思是not a number在很多语言中都有如果在编译时增加了-ffast-math -ffast-math -use_fast_math选项用于浮点数计算加速则可能会导致std::nan失效不再能有效判断nan此果需要我们自己写一个nan函数bool isNan(float f) { union { float f; uint32_t x; } u { f }; return (u.x 1) 0xff000000u; }参考文献C double和float浮点类型详解
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2451322.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!