草庐IT

c++ - 对 "same"类型转换的不同结果感到困惑, float 到 int

如果我先将一个值分配给一个变量的浮点计算,然后将其分配给一个带有隐式类型转换的unsignedint,我得到一个答案。但是,如果我将相同的计算直接分配给unsignedint,再次使用隐式类型转换,我会得到不同的答案。下面是我编译并运行来演示的示例代码:#includeintmain(intargc,char**argv){floatpayloadInTons=6550.3;//Above,payloadInTonsisgivenavalue.//Below,twodifferentwaysareusedtotypecastthatsamevalue,//buttheresultsdo

c++ - 将 float 转换为 double

将float转换为double的代价是多少?它是否像int到long的转换一样微不足道?编辑:我假设一个平台,其中float是4个字节,double是8个字节 最佳答案 平台注意事项这取决于用于float计算的平台。对于x87FPU,转换是免费的,因为寄存器内容是相同的——您有时可能付出的唯一代价是内存流量,但在许多情况下甚至没有流量,因为您可以简单地使用该值而无需任何转换。x87在这方面实际上是一个奇怪的野兽-很难正确区分float和double,因为使用的指令和寄存器是相同的,不同的是加载/存储指令和计算精度本身是使用状态位控制

c++ - 将整数存储为 float

假设我有一个API只允许我存储float或float数组。但是,我想在这里存储整数值。我(大致)理解我可以接受高达2^23左右的直接转换,但如果我想更高怎么办?有什么方法可以利用float的更多32位并确保我会得到相同的数字?为了澄清:我正在使用Pixar的PRMan(即RenderMan)对点云进行一些操作。我可以用C或C++编写链接预编译点云API。PRMan在任何时候都不必使用我存储的这些整数;我只需要它在对附加到这些点的其他数据进行操作后将它们原封不动地交还给我。 最佳答案 有疑问的:在C中,您可以执行以下操作,这可能是不安

c++ - C++11 类型推断如何决定 float 或 double ?

考虑这个类型推断的例子:autovar=1.0;在C++11类型推断下,它的计算结果是float还是double?可以控制这种行为吗? 最佳答案 它将被评估为double是的,您可以控制它。在标准ISO-14882:2011中,2.14.4float文字,第1点:Thetypeofafloatingliteralisdoubleunlessexplicitlyspecifiedbyasuffix.ThesuffixesfandFspecifyfloat,thesuffixeslandLspecifylongdouble.Ifthes

c++ - 比 double 更精确的 float 据类型?

在我的项目中,我必须计算double元素矩阵的除法、乘法、减法和加法。问题是,当矩阵的大小增加时,我的输出精度会受到极大影响。目前,我对每个元素使用double,我认为它使用8字节的内存并且具有16位的精度,无论小数点位置如何。即使对于大尺寸矩阵,所有元素占用的内存也在几千字节的范围内。所以我可以负担得起使用需要更多内存的datatypes。所以我想知道哪种数据类型比double更精确。我试着在一些书中搜索,我可以找到longdouble。但我不知道它的精度是多少。如果我想要比这更高的精度怎么办? 最佳答案 根据维基百科,80位“I

c++ - 如何检查一个 float 是否是 C++ 中的真实数字?

如何检查float是否为真数?即:不是无穷大,负无穷大,NaN...floatf;??? 最佳答案 比std::fpclassify()更简单的是使用std::isfinite()Determinesifthegivenfloatingpointnumberarghasfinitevaluei.e.itisnormal,subnormalorzero,butnotinfiniteorNaN. 关于c++-如何检查一个float是否是C++中的真实数字?,我们在StackOverflow上

c++ - 精确为零的 float / double 相等

我有一个算法,它使用floats或doubles来执行一些计算。例子:doublea;doubleb;doublec;...doubleresult=c/(b-a);if((result>0)&&(result现在,我担心(b-a)可能为零。如果它接近于零但不为零,那没关系,因为result将超出有用范围,而且我已经检测到(如(b-a)接近零,result将接近+/-inf,这不在范围0-small_number...)但是如果(b-a)的结果恰好为零,我预计由于被零除会发生一些依赖于平台的事情。我可以将if语句更改为:if((!((b-a)==0.0))&&((result=c/(b

c++ - 将 float 舍入为 n 位有效数字的 C 例程?

假设我有一个float。我想将它四舍五入到一定数量的有效数字。在我的例子中n=6。所以说float是f=1.23456999;round(f,6)会得到1.23457f=123456.0001会得到123456有人知道这样的套路吗?它在网站上有效:http://ostermiller.org/calc/significant_figures.html 最佳答案 将数字乘以合适的比例因子,将所有有效数字移至小数点左侧。然后四舍五入最后反转操作:#includedoubleround_to_digits(doublevalue,intd

c++ - 将 int 转换为 float : how it is done

我刚接触C语言,想请教一个问题。此处的整数i转换为float,然后f(以某种方式)成功表示5.0:inti=5;floatf=i;//Somethinghappenedhere...但是如果我们尝试这种方法:inti=5;floatf=*(float*)&i;f不会得到5.0,因为它以“float方式”解释存储在i中的位。那么编译器在第一种情况下实际上做了什么魔术呢?这似乎是一项相当费力的工作......有人可以具体说明吗?谢谢。 最佳答案 这是一项费力的工作,但任何支持float的CPU都会提供执行此操作的指令。如果您必须自己将2

c++ - 用 ostringstream 舍入 float

我有一个关于使用ostringstream从float到C++字符串的转换的问题。这是我的台词:voiddoSomething(floatt){ostringstreamstream;stream当t的值为-0.89999时,它会四舍五入为-0.9,但当它的值为0.0999或小于1.754e-7时,它只会打印而不会四舍五入。有什么解决方案。 最佳答案 您需要使用precision设置ostringstream的精度例如stream.precision(3);stream 关于c++-用o