草庐IT

floating-point-conversion

全部标签

c++ - 为什么成员 `float x` 在 main() 中为对象 `0.` 和 `a` 初始化为 `b`?

这个问题在这里已经有了答案:Defaultvariablevalue(10个答案)关闭8年前。有人可以指出标准中的哪个条款支持在Coliru中获得的以下行为,对于代码段:#includeclassA{inti;floatx;public:A():i(10){}A(inti):i(i){}intGetI(){returni;}floatGetF(){returnx;}};intmain(){Aa;Ab(1);Ax{};Ay{1};std::cout代码打印:1001010010编辑:这段摘自TCPL第4版,第490页:Forthis,therulesarenotascleanaswemi

c++ - 获取 POSIX 纪元作为 system_clock::time_point

我知道std::chrono::system_clock::time_point的默认值是时钟的纪元,但我在C++11标准中找不到任何规定system_clock的纪元与POSIX纪元(1970-01-01T00:00:00Z)相同。在Linux和Windows上假设是这种情况是否安全?或者使用std::chrono::system_clock::from_time_t(0)会更聪明吗? 最佳答案 标准离开std::chrono::system_clock::time_point的纪元未指定。std::chrono::system_

c++ - 如果硬编码 float 可以用 IEEE 754 中的二进制格式表示,它是否精确?

例如,0、0.5、0.15625、1、2、3...是从IEEE754转换而来的值。它们的硬编码版本是否精确?例如:是floata=0;if(a==0){returntrue;}总是返回真?其他例子:floata=0.5;floatb=0.25;floatc=0.125;a*b是否总是等于0.125而a*b==c总是为真?还有一个例子:inta=123;floatb=0.5;a*b总是61.5吗?或者一般来说,整数乘以IEEE754二进制float是否精确?或者一个更普遍的问题:如果值是硬编码的,并且值和结果都可以用IEEE754中的二进制格式表示(例如:0.5-0.125),那么该值是

c++ - STL中的 float 比较,BOOST

STL或Boost中是否有一套通用的简单比较函数?我发现的那个总是需要模板参数,和/或实例化一个结构模板。我正在寻找语法如下的内容:if(is_equal(x,y)){...}可以实现为:templateboolis_equal(constT&x,constT&y){return(fabs(x-y)::eps);}编辑:我将运算符更改为等于。(见下面的评论) 最佳答案 我不知道有哪个库可以做到这一点,也许是因为它像一行代码一样简单,或者也许是因为它被遗忘了......尽管如此,您确定要在整个应用程序中为给定值的给定类型设置epsil

c++ - 奇怪的 uint32_t 到 float 数组转换

我有以下代码片段:#include#includestaticconstsize_tARR_SIZE=129;intmain(){uint32_tvalue=2570980487;uint32_tarr[ARR_SIZE];for(intx=0;x(arr[x]);}printf("%s\n",arr_dst[ARR_SIZE-1]==arr_dst[ARR_SIZE-2]?"OK":"WTF??!!");printf("magic=%0.10f\n",arr_dst[ARR_SIZE-2]);printf("magic=%0.10f\n",arr_dst[ARR_SIZE-1]);r

c++ - 关闭 float 的科学记数法

我正在尝试以标准符号显示数字例如:floatf=1230000.76结果是,1.23e+006 最佳答案 在iomanip中发现有两件事必须包含在内。第一个是fixed,第二个是setprecision你需要写:std::coutfixed禁用科学计数法,即1.23e+006并且fixed是一个粘性操纵器,因此如果您想恢复为科学计数法,则需要禁用它。 关于c++-关闭float的科学记数法,我们在StackOverflow上找到一个类似的问题: https:/

c++ - x/a 与 float 的 x*(1/a) 相同吗?

使用floata=...;和floatinva=1/a;是x/a与相同x*inva?这个案例是什么:unsignedi=...;floatv1=static_cast(i)/4294967295.0f;floatscl=1.0f/4294967295.0f;floatv2=static_cast(i)*scl;对于所有无符号整数,v1是否等于v2? 最佳答案 isv1equaltov2forallunsignedintegers?是的,因为4294967295.0f是2的幂。当除数是2的幂时,除以倒数和乘以倒数是等价的(假设倒数的计

c++ - 错误 C2678 : binary '==' : no operator found which takes a left-hand operand of type (or there is no acceptable conversion)

我正在尝试编译以下代码:#include#include#includetypedefboost::geometry::model::d2::point_xyPoint;typedefstd::pairVector;booloperator==(constPoint&p1,constPoint&p2){returnp1.x()==p2.x()&&p1.y()==p2.y();}intmain(){Vectorvec1(Point(0,0),Point(1,1));Vectorvec2(Point(0,0),Point(1,2));std::coutVS2012C++编译器返回以下编译错

c++ - 我必须使用 0.f 初始化 float 吗?

当我在我的程序中初始化float变量时,我通常有这样的vector:Vectorforward(0.f,0.f,-1.f),right(1.f,0.f,0.f),up(0.f,1.f,0.f)(vector只是3个float,如structVector{floatx,y,z;};)这看起来多更容易阅读:Vectorforward(0,0,-1),right(1,0,0),up(0,1,0)我必须使用float来初始化我的float变量吗?当我使用整数(或double)初始化float时,我是否会丢失任何东西或招致某种惩罚? 最佳答案

c++ - 16 位 float 和 GL_HALF_FLOAT

我正在寻找/编写16位float的C++实现,以与OpenGL顶点缓冲区(纹理坐标、法线等)一起使用。到目前为止,这是我的要求:必须是16位(显然)。必须能够使用GL_HALF_FLOAT上传到OpenGL顶点缓冲区。必须能够表示超出-1.0-+1.0的数字(否则我只会使用标准化的GL_SHORT)。必须能够与普通32位float相互转换。算术运算无关紧要-我只关心存储。速度不是主要问题,正确性才是。这是我到目前为止的界面:classhalf{public:half(void):data(0){}half(consthalf&h):data(h.data){}half(constuns