- 为什么C++不像java需要jdk,而可以直接编译?
Java是运行在JVM中的,并且是编译成JVM可识别加载的.class,并不是完全编译成计算机直接可执行的程序,C++ 程序直接可在计算机中执行。
JDK除了提供基本的类库之外,还提供了编译java源文件成.class的工具。
C++在系统中运行时,也需要对应的运行库。 有一些没有封装在系统中,也需要C++运行库的支持,默认是没有安装在系统中的。
在C++中不同精度浮点数直接比较大小精度是不一样的(比如float的0.1和double类型的0.1比较)
#include#include using namespace std; int main() { float a = (float)0.1; float b = (float)0.1; if(a == b) cout << "a == b" << endl; else cout << "a == b" << endl; float c = (float)0.1; double d = (double)0.1; if(c == d) cout << "c == d" << endl; else cout << "c != d" << endl; return 0; }
结果:
按照博文计算机中基本类型float值表示和大小比较问题的说法:
即使在精度相同的情况下,比较也可能会出问题。因为在运算过程中会将内存(或高速缓存)中的值加载到CPU浮点寄存器(80 bit扩展精度)中,然后再进入CPU浮点计算单元进行计算,计算结果写回浮点寄存器,然后写回内存(或高速缓存)。从内存到浮点寄存器,浮点数的精度会扩展,从浮点寄存器到内存,浮点数的精度会降低(精度扩展通常没问题,但如果精度降低了,很可能值会发生变化,出现截断),而浮点运算的结果由于下面还要使用所以暂时保存在浮点寄存器中留待下次使用(没有及时写回内存,这是一种优化策略),从而导致数据并不是内存中和内存中的数据比较而是浮点寄存器中的值和内存中的值进行比较,而无论内存中是float类型还是double类型,其精度和浮点寄存器精度都不相同,从而导致比较结果是不相等。
解决方法:使用一个约定的精度比较float e = (float)0.1; float f = (double)0.1; if(abs(e - f) < 0.0001) cout << "e == f" << endl; else cout << "e != f" << endl;
C++中fabs和abs函数的区别
abs和fabs,abs是对整数取绝对值,而fabs是对浮点数(double,float)取绝对值。
C++中有两个库可以调用abs函数,一个是cmath库,实测,abs(-3.4)就是3.4;一个是cstdlib库,abs(-3.4)会报错,只支持转换int类型值的绝对值.
作用域不一样(目前还没有进一步尝试)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)