草庐IT

C++浮点精度

全部标签

c++ - 如何处理浮点计算中的超精度?

在我的数值模拟中,我有类似于以下片段的代码doublex;do{x=/*somecomputation*/;}while(x对于某些平台(例如linux、x87数学)上的某些编译器(例如gcc),可能会出现x以高于double的方式计算(“超精度”)。(更新:当我在这里谈论精度时,我指的是精度/和/范围。)在这些情况下,可以想象比较(x)返回false,即使下一次x被四舍五入降低到double,它变为0。(并且不能保证x不会在任意时间点向下舍入。)有什么方法可以执行这种比较是可移植的,在内联代码中工作,没有性能影响并且不排除一些任意范围(0,eps)?我尝试使用(x::denorm_m

c++ - 为什么这两种代码变体会产生不同的浮点结果?

给定此示例C++代码片段:voidfloatSurprise(){//thesecomefromsomesortofcalculationinta=18680,b=3323524,c=121;floatm=float(a)/c;//variant1:calculateresultfromsingleexpressionfloatr1=b-(2.0f*m*a)+(m*m*c);cout输出是:dev1=439703dev2=439702在调试器中查看时,值实际上分别为439702.50和439702.25,这本身很有趣-不确定为什么iostream默认打印没有小数部分的float。编辑:

c++ - 为什么在 MSVC 中默认将浮点值(如 3.14)视为 double 值?

为什么我需要放置3.14f而不是3.14来禁用所有这些警告?这是否有连贯的原因? 最佳答案 这就是C++(和C)标准所决定的。浮点文字是double类型,如果你需要它们是float,你可以在它们后面加上一个f后缀。似乎没有任何具体说明原因,但我猜它是a)为了与C的兼容性,以及b)在精度和存储之间进行权衡。2.13.3FloatingliteralsThetypeofafloatingliteralisdoubleunlessexplicitlyspecifiedbyasuffix.ThesuffixesfandFspecifyfloa

测试使用扫描仪与时嵌套的扫描仪的输入精度测试,如果/else语句

因此,我试图使用一段时间循环继续要求输入,而用户的随机数输入不等于随机数发生器的输出。但是,当我输入数字时,较高/较低的输出不起作用。无论实际数值如何,它总是说它更高,或者总是说较低。帮助?importjava.util.Random;importjava.util.Scanner;publicclassGuessingGame{publicstaticfinalintMAX=100;publicstaticvoidmain(String[]args){Scannerscan=newScanner(System.in);Randomrand=newRandom();intrand1=rand.

c++ - 浮点负无穷大的 std::exp 为 Visual C++ 2013 中的 x64 构建返回负无穷大

使用std::exp计算e^-infinity在使用无穷大的浮点表示和构建x64二进制文件时返回-infinity使用VisualC++2013。我希望它返回0,这是Win32版本或采用double的std::exp版本的情况。以下构建为x64的代码演示了该问题。#include#includeintmain(constintargc,constchar**argv){std::cout::infinity())::infinity())编译的命令行选项(取自VisualStudio):/GS/Wall/Gy/Zc:wchar_t/Zi/Gm-/Od/sdl/Fd"x64\Releas

c++ - 对于浮点值 a : Does a*0. 0 == 0.0 对于 a 的有限值总是求值为真?

我一直假设以下测试对于somefloat的有限值(没有INF,没有NAN)总是会成功:assert(somefloat*0.0==0.0);在Multiplyby0optimization据说doublea=0.0和doublea=-0.0严格来说不是同一件事。所以我想知道这是否会导致某些平台出现问题,例如上述测试的结果是否取决于abeeingpositiveornegative. 最佳答案 如果您的实现使用IEEE754算法(大多数都这样做),那么正零和负零将比较相等。由于表达式的左侧对于有限a只能是正零或负零,因此断言将始终为真

c++ - C 或 C++ 中的亚毫秒精度计时

在C或C++中获取亚毫秒精度计时数据的技术/方法有哪些,它们提供的精度和准确度如何?我正在寻找不需要额外硬件的方法。该应用程序需要等待大约50微秒+/-1微秒,同时某些外部硬件会收集数据。编辑:操作系统是Wndows,可能是VS2010。如果我可以在Linux上获得硬件的驱动程序和SDK,我可以使用最新的GCC去那里。 最佳答案 在处理现成的操作系统时,准确计时是一项极其困难和复杂的任务。如果您真的需要保证时序,唯一真正的选择是一个完整的实时操作系统。但是,如果“几乎总是”足够好,您可以使用以下一些技巧,它们将在商品Windows和

c++ - 为什么 decimal128 可能会被标准化而 quad precision 不会?

这是一个非常幼稚的问题。如果我们看看C和C++标准委员会,他们目前正在致力于添加十进制浮点标准类型:linktotheCproposallinktotheC++proposal所以看起来我们可能会有一个标准化的decimal128类型,而我们还没有任何标准化的binary128类型(四精度而不是简单的扩展double)。这种情况是有技术原因还是纯粹是“政治”? 最佳答案 四精度二进制float不能替代十进制类型。精度问题仅次于十进制数的表示。这个想法是在语言中添加一种类型来支持像0.1这样的数字表示,而不会损失任何精度——这是二进制

c++ - 处理浮点异常

我不确定如何在C或C++中处理浮点异常。来自wiki,有以下类型的浮点异常:IEEE754specifiesfivearithmeticerrorsthataretoberecordedin"stickybits"(bydefault;notethattrappingandotheralternativesareoptionaland,ifprovided,non-default).*inexact,setiftherounded(andreturned)valueisdifferentfromthemathematicallyexactresultoftheoperation.*un

c语言冲刺,1、输入一个实数,分别输出其整数部分和小数部分2、输入三个单精度数,输出最小值3、计算a-b之间所有奇数之和与偶数之和,a,b,通过键盘输入4、使用以下公式计算π,要求精度<1e-5

1、输入一个实数,分别输出其整数部分和小数部分第一种:强制类型转换#includemain(){   doublen;   printf("input:");   scanf("%lf",&n);   printf("%d,%f\n",(int)n,n-(int)n);}第二种:定义两种类型#includemain(){   doublen;   intm;   printf("input:");   scanf("%lf",&n);   m=n;//3.14   printf("%d,%f\n",m,n-m);} 2、输入三个单精度数,输出最小值第一种:利用条件运算符来 #includema