草庐IT

c++ - C++程序中浮点溢出的诊断

我有一种情况,其中一些数值结果(涉及使用double和float的浮点运算)对于大输入大小变得不正确,但对于小输入大小却不正确。一般来说,我想知道哪些工具可用于诊断数值溢出和有问题的精度损失等情况。换句话说:是否有一个工具提示溢出等问题,就像valgrind提示内存错误一样? 最佳答案 如果启用浮点异常,则FPU可以在溢出时抛出异常。具体如何工作取决于操作系统。例如:在Windows上,您可以使用_control87取消屏蔽_EM_OVERFLOW以便在溢出时获得C++异常。在Linux上,您可以使用feenableexcept在F

c++ - 散列浮点值

最近,我很好奇浮点哈希算法是如何工作的,所以我查看了boost::hash_value的源代码。原来是fairlycomplicated.实际的实现循环遍历基数中的每个数字并累积一个哈希值。与整数散列函数相比,它涉及更多。我的问题是:为什么浮点哈希算法应该更复杂?为什么不直接对浮点值的二进制表示进行散列,就好像它是一个整数一样?喜欢:std::size_thash_value(floatf){returnhash_value(*(reinterpret_cast(&f)));}我意识到float不能保证在所有系统上都与int大小相同,但是可以使用一些模板元程序来处理这种事情推导出与fl

c++ - 浮点,我可以信任多少小于/大于比较?

假设我有两个float,我想比较它们。如果一个大于另一个,程序应该采用一个fork。如果情况正好相反,它应该走另一条路。并且它应该做同样的事情,如果被比较的值在一个仍然应该使它比较真实的方向上被轻轻插入。这是一个很难表达的问题,所以我写了这个来演示它-floata=random();floatb=random();//alwaysreturnsanumber(noinfinityorNaNs)if(a=b){if(!(a>=b-FLOAT_EPISILON))launchTheMissiles();buildOrphanages();}else{launchTheMissiles();

c++ - 为什么 c/c++ 浮点类型的命名如此奇怪?

C++提供三种浮点类型:float、double和longdouble。我很少在我的代码中使用float,但是当我这样做时,我总是被诸如之类的无害行上的警告所吸引floatPiForSquares=4.0;问题是文字4.0是double,而不是float-这很烦人。对于整数类型,我们有shortint、int和longint,这很简单。为什么C没有短float、float和长float?“double”到底是从哪里来的?编辑:float类型之间的关系似乎类似于整数。double必须至少与float一样大,longdouble至少与double一样大。没有其他精度/范围保证。

c++ - 获取错误浮点异常: 8

我不知道为什么g++不喜欢我的代码。它在java中运行良好。任何见解将不胜感激。#includeusingnamespacestd;boolisPrime(longnumber);intmain(){constlongnumber=600851475143;longmax=0;for(longi=0;i*i 最佳答案 constlongnumber=600851475143;有溢出,long不能容纳那么大的数字。见thislinkLONG_MAXis2147483647尝试:constunsignedlonglongnumber=6

c++ - C++中的浮点格式

如何在C++中格式化float以输出到四舍五入的两位小数?我对setw不满意和setprecision正如我的编译器告诉我的那样,它们是notdefined.cout总输出:Total:12.3961我希望它是:12.40或12.39如果收集起来工作量太大。 最佳答案 您需要包含并将命名空间范围提供给setwandsetprecision#includestd::setw(2)std::setprecision(5)尝试:cout.precision(5);cout或coutiostream提供了精度功能,但要使用setw,可能需要

c++ - 如果 operator< 适用于浮点类型,为什么我们不能将它用于相等性测试?

正确测试两个float是否相等是很多人(包括我)不完全理解的事情。然而,今天,我想到了一些标准容器如何根据operator来定义相等性。我总是看到人们在平等方面存在问题,但从来没有在其他关系比较方面遇到过问题。甚至还有silentversions可供使用,包括除平等和不平等之外的所有内容。假设operator工作“正常”,不像operator==,为什么我们不能这样做:boolfloateq(floata,floatb){//checkNaNreturn!(a事实上,如here所示,我确实运行了一个额外重载double的测试,它似乎与将它们与operator==进行比较时存在相同的缺陷

c++ - C++中是否有浮点文字后缀来使数字 double ?

我目前正在从事一个进行数值计算的C++项目。绝大多数代码使用单精度浮点值,并且可以很好地使用它。因此,我使用编译器标志来使基本的浮点文字单精度而不是double,这是默认的。我发现这使表达式更易于阅读,而且我不必担心在某处忘记“f”。但是,我时不时需要double计算提供的额外精度,我的问题是如何将double文字放入这样的表达式中。到目前为止,我尝试过的每种方法都首先将值存储在单精度变量中,然后将截断的值转换为double值。不是我想要的。下面给出了我目前尝试过的一些方法。#includeintmain(){std::cout(1.0E200))(1.0E200)使用单精度常量运行会

C++17 和十进制浮点的当前状态

C++中十进制浮点的现状如何?我特别关注语言包容性、标准合规性和可移植性的状态。有许多“官方”库基于现有标准(尤其是IEEE754-2008),这些标准被认为是纳入标准的基础:BloombergBDLDecimalFloatLibrarylibdfp(originallyIBMDecimalFloatingPointLibrary)此外,还有一个proposal将十进制float添加到C++14。根据thispost中的提议者它没有及时提交以供收录(请参阅答案评论)。我还检查了C++17features的许多来源。,但我找不到十进制float。我知道一些编译器(例如GCC和Clang)

c++ - 如何检测 double 浮点上溢和下溢?

我有以下变量:doubledblVar1;doubledblVar2;它们的值可能很大,但小于doublemax.我对上述变量有各种算术,比如加法、乘法和幂:doubledblVar3=dblVar1*dblVar2;doubledblVar4=dblVar1+dblVar2;doubledblVar5=pow(dblVar1,2);在以上所有内容中,我必须检查上溢和下溢。如何在C++中实现这一点? 最佳答案 很大程度上取决于上下文。要完美便携,您必须检查之前操作,例如(补充):if((astd::numeric_limits::m