草庐IT

float_val

全部标签

c++ - float <-> std::string 转换替代方案?

有没有atof、strtod、lexical_cast、stringstream或sprintf?即:快C++方式(std::string而不是char*)安全(无缓冲区溢出风险)有效(如果无法进行转换则返回NaN)没有外部图书馆(独立)我更喜欢this,一个简单的函数,经过优化,切中要点原因:atof和strtod是C函数,它们在失败时不返回NaN,我更喜欢使用std::string,所以我只是问是否有人已经为我可以使用的std::string编写了一些包装器(如果您不介意的话)。lexical_cast具有增强依赖性stringstream很慢sprintf存在缓冲区溢出风险及其C

c++ - 英特尔 TBB 中的原子 double / float

根据文档,atomic支持整数类型的T,枚举类型,或者指针类型。英特尔TBB是否正式支持float/double?我看过一些补丁here和RafSchietekathere,它可能/可能没有被合并到最新的4.0版本中。从我通读的补丁中,我注意到的唯一主要区别是将reinterpret_cast从整数类型添加到float/double。如果有人能澄清这一点,我将不胜感激。谢谢! 最佳答案 您可以轻松添加对基于64位和32位原子整数构建的float的支持。原子加载/存储/交换可以使用reinterpret_cast作为直接包装器实现,原

c++ - 将 float 与整数进行比较的符合标准的方法?

假设我有两个对象i和f各类型I和F.我知道std::is_integral::value是真的,std::is_floating_point::value是真的。是否有一种完全符合标准的方法来查明i的值是否为小于f的值?请注意对“完全符合标准”的强调,对于这个问题,我只对得到C++标准保证的答案感兴趣。简单的实现i不起作用,因为f的值可能放不下i.简单的实现F(i)也不起作用,因为f的精度可能不足以表示i,导致i舍入为等于f的值(如果你有IEEE754float,16777219失败)。但真正的困境来了:如果你想使用std::numeric_limits::max为了缓解这些问题,您回

c++ - 在 C++ 中拥有大 float

我想用C++编写自己的变量“type”作为作业。它应该是一个任意长的float。我在想这样的结构......代码:classbigFloat{public:bigFloat(arguments);~bigFloat();private:std::vectorbefore;//numbersbeforedecimalpointstd::vectorafter;//numbersafterdecimalpointintpos;//positionofdecimalpoint};如果我有这样的数字:3.1415之前='3';在='1415'之后;位置=1;如果这对您有意义...但是赋值需要我

c++ - 否定 float 总是安全的吗

考虑:doublef=foo();doubleg=-f;其中foo()可以返回分配给f的任何内容。doubleg=-f;在C和C++中安全吗?对于IEEE754类型,它显然是,但C和C++不限制浮点实现(与Java不同)。如果它是安全的,那么-g是否总是将true与foo()进行比较?(以上不适用于2的补码中的int)。 最佳答案 float类型由C标准的§5.2.4.2.2定义(至少是N1570草案):Thecharacteristicsoffloatingtypesaredefinedintermsofamodelthatdes

c++ - 不一致的警告 "conversion from ' const unsigned char' to 'const float' requires a narrowing conversion”

VisualC++2017和gcc5.4产生conversionfrom'constunsignedchar'to'constfloat'requiresanarrowingconversion警告LineB但没有此代码段中的A行:#includeintmain(){constunsignedcharp=13;constfloatq=p;//LineAstd::cout这个警告有效吗?为什么LineB的处理方式与LineA不同? 最佳答案 警告有效,来自C++11narrowingconversions在aggregateiniti

c++ - 给定二进制随机数生成器生成随机 float 的正确方法?

假设我们有一个二进制随机数生成器intr();,它将返回0或1,概率均为0.5。我查看了Boost.Random,它们生成了32位并执行类似这样的操作(伪代码):x=double(rand_int32());returnmin+x/(2^32)*(max-min);我对此有一些严重的怀疑。double有53位尾数,而32位永远无法正确生成完全随机的尾数,其中包括舍入误差等。在半开范围[min,max)中创建均匀分布的float或double的快速方法是什么,假设IEEE754?这里的重点在于分发的正确性,而不是速度。为了正确定义正确,正确的分布将等于如果我们采用无限精确的均匀分布随机数

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中,您可以执行以下操作,这可能是不安