谁能解释为什么当我使用setprecision()时这两个相同值的变量可以输出不同的值?#include#includeintmain(){floata=98.765;doubleb=98.765;//std::couta的输出将为98.76,而b的输出将为98.77。 最佳答案 那些变量不具有相同的值。当您将98.765的字面值double硬塞进float时,它必须进行最佳匹配,并且会损失一些精度。如果将精度更改为50,您可以很容易地看到这一点,您还会看到即使是double也不能准确表示该值:98.7649993896484375
下面的程序总是输出“Error:double10.2”。我不明白为什么。根据我的说法,如果fun1()只允许抛出int,那么程序应该要么(1)崩溃(2)或者把double改成int然后throw。这意味着,输出应该是“Error:int10”。然而,情况并非如此。谁能解释一下??voidfun1()throw(int){cout 最佳答案 您的编译器不符合标准。根据标准,您的程序应以调用std::unexpected结束。在让double异常转义fun1之后。也就是说-不要使用异常规范。它们已被弃用且无用。
我刚遇到这行代码:if(lineDirection.length2()){...}其中length2返回一个double。让我有点困惑的是0.0等同于0、NULL和/或false。这是C++标准的一部分还是未定义的行为? 最佳答案 这是一个非常标准的行为(bool转换)$4.12/1-"Anrvalueofarithmetic,enumeration,pointer,orpointertomembertypecanbeconvertedtoanrvalueoftypebool.Azerovalue,nullpointervalue,
我有点难以存储具有最大可用精度的数字:doubletmp=569.232306826889043804840184748172760009765625L;我正在尝试将其打印在屏幕上:printf("%0.52f\n",tmp);这就是我所拥有的:569.2323068268890400000000000000000000000000000000000000这是我能达到的最大精度吗?附言我正在使用VisualStudio2008 最佳答案 double通常存储在IEEE754binary64中格式。binary64具有52位精度,而不
我遇到了将值从Double转换为int的问题。我尝试运行以下代码:intmain(){doubleval_d=6.25e-05;cout从double到int的转换可能会删除小数部分,但应保留整数部分是吗?我得到的输出是:1600015999那么为什么这里的o/p不同呢?这只发生在软呢帽上。在Windows和Ubuntu上它工作正常。(两个输出都是16000)我调整了上面的代码并得到了以下结果:intmain(){doubleval_d=6.25e-05;cout新输出是160001600016000 最佳答案 当源文本“6.25e
这个问题听起来像是针对初学者的,但是当我发现这个问题时,我想我要么是初学者,要么我的comp缺少一些东西:intmain(){cout程序输出:881515我以为longdouble是10个字节,有18个十进制数字,而double是8个字节,有15个数字,但看来我错了。为什么会这样?在64位机器上使用MSVC2010。 最佳答案 如您所知,在MSVC++中,longdouble是double的同义词。显然这是为了利用仅限于64位操作的SSE/SSE2/SSE3指令集。另见here获取更多信息。
在StanleyB.Lippman的C++Primer中,关于“隐式转换”的部分说:intival;unsignedintui;floatfval;fval=ui-ival*1.0;ivalisconvertedtodouble,thenmultipliedby1.0.Theresultisconvertedtounsignedint,thensubtractedbyui.Theresultisconvertedtofloat,thenassignedtofval.但我不这么认为:我认为实际上ival被转换为double然后乘以1.0然后ui是哪个是类型unsignedint转换为do
我想检查给定的double/浮点变量是否具有实际位模式0x0。不要问为什么,它用在Qt中的一个函数中(qIsNull()),我希望它是constexpr。原始代码使用了union:union{doubled;int64_ti;}u;u.d=d;returnu.i==0;这当然不能用作constexpr。下一次尝试使用reinterpret_cast:return*reinterpret_cast(&d)==0;但是虽然它在GCC4.7中作为constexpr工作,但它在Clang3.1中失败了(正确地,指针操作的b/c)。最后的想法是去Alexandrescuesque做这个:temp
我正在寻找一种将字符串解析为int或double的方法,解析器应该尝试这两种选择并选择与输入流的最长部分匹配的那个。有一个已弃用的指令(longest_d)完全符合我的要求:number=longest_d[integer|real];...既然它已被弃用,还有其他选择吗?如果有必要实现语义操作来实现所需的行为,有人有什么建议吗? 最佳答案 首先,请切换到SpiritV2-多年来它已经取代了经典spirit。其次,您需要确保首选int。默认情况下,double可以很好地解析任何整数,因此您需要改用strict_real_polici
我找到了很多关于这个错误的帖子,但我可以找到克服它的方法。这是触发错误的代码:voidmain(){floatf{1.3};}为什么在初始化列表中没有像其他变量那样发生转换?例如,这工作顺利:floatf=1.3; 最佳答案 您评论说使用1.3会导致您的编译器出错。这意味着您发现了一个编译器错误。标准很清楚这不是缩小转换,因此应该允许。引用N4140(大致为C++14):8.5.4List-initialization[dcl.init.list]7Anarrowingconversionisanimplicitconversion