草庐IT

float_val

全部标签

C++ 声明独立于平台的 32 位 float

有没有办法在C++中声明32位浮点值-确保无论平台/编译器如何,它始终是32位?我可以对这样的整数做到这一点:#includeuint32_tvar;//32bitunsignedintegeruint64_tvar1;//64bitunsignedinteger有没有办法为花车做类似的事情?据我所知,floatvar;//Usuallyis32bit,butNOTGUARANTEEDtobe32bit是特定于实现的,不一定是32位的。(如果我错了,请纠正我)。我正在使用qt,所以如果有任何使用它的解决方案,我会接受它-我找不到类似quint16的float(qreal会根据平台更改大

c++ - float 与定点数 : what are the pros/cons?

浮点类型通过将有效数字和指数分别存储在单独的二进制字中来表示数字,因此它适合16、32、64或128位。定点类型用2个字存储数字,一个代表整数部分,另一个代表小数部分,负指数,2^-1、2^-2、2^-3等。float更好,因为它们在指数意义上具有更广泛的范围,但如果想要在某个范围内以更高的精度存储数字,例如仅使用-16到16之间的整数,因此使用更多位来保存数字,则不是超过基数。在性能方面,哪一个性能最好,或者是否存在一些比另一个更快的情况?在视频游戏编程中,每个人都使用float是因为FPU让它更快,还是因为性能下降可以忽略不计,还是他们自己制作固定类型?为什么C/C++中没有固定类

c++ - 打印 float ,保持精度

我正在编写一个程序,它打印浮点文字以在另一个程序中使用。为了保持原始float的精度,我需要打印多少位?由于float具有24*(log(2)/log(10))=7.2247199十进制数字精度,我最初的想法是打印8位数字就足够了。但如果我不走运,那些0.2247199会分布在7个有效数字的左侧和右侧,所以我可能应该打印9个十进制数字。我的分析正确吗?对于所有情况,9个十进制数字是否足够?像printf("%.9g",x);?在7或8就足够的情况下,是否有一个标准函数可以将float转换为具有该值所需的最小小数位数的字符串,所以我不打印不必要的数字?注意:我不能使用十六进制浮点文字,因

c++ - 如何加快 float 到整数的转换?

这个问题在这里已经有了答案:Whatisthefastestwaytoconvertfloattointonx86(10个回答)关闭7年前。我们在项目中进行了大量的浮点到整数的转换。基本上是这样的for(inti=0;i执行转换的默认C函数非常耗时。是否有任何解决方法(可能是手动调整的功能)可以稍微加快处理速度?我们不太关心精度。 最佳答案 这里的大多数其他答案只是试图消除循环开销。仅限deft_code'sanswer触及可能是真正问题的核心——将float转换为整数在x86处理器上的成本惊人地高。deft_code的解决方案是正

c++ - C/C++ 中的定宽 float

int通常为32位,但在标准中,int不保证具有恒定宽度。所以如果我们想要一个32位的int我们包含stdint.h并使用int32_t。对于float是否有等价物?我意识到float有点复杂,因为它们不是以均匀的方式存储的,即符号、指数、有效数。我只想要一个double,它保证以64位存储,具有1个符号位、10位指数和52/53位有效位(取决于您是否计算隐藏位)。 最佳答案 根据thecurrentC99draftstandard,附件F,应该是双倍的。当然,这是假设您的编译器符合标准的该部分。对于C++,我已经检查了0x草案和1

c++ - 在 float 不好的样式上使用增量(运算符++)吗?

在float上使用增量运算符(++)是否被认为是“不好的风格”?它编译得很好,但我觉得它很臭而且违反直觉。问题:在什么情况下,在浮点变量上使用++是合理的并且比+=1.0f更好?如果没有用例,是否有受人尊敬的C++风格指南明确指出++onfloat是邪恶的?对于float++,不会以最小的可能值递增,而是以1.0递增。1.0f没有特殊含义(与整数1不同)。这可能会使读者感到困惑,导致他认为变量是int。对于float,不能保证operator++会更改参数。例如下面的循环不是无限的:floati,j;for(i=0.0,j=1.0;i!=j;i=j++);因此在--之后立即执行++并不

c++ - 将 float 转换为定点数

在C++中,将任何浮点值(float)转换为fixedpoint的通用方法是什么?(int,16:16或24:8)?编辑:为了澄清,定点值有两个部分:整数部分和小数部分。整数部分可以用有符号或无符号整数数据类型表示。小数部分由无符号数据整数数据类型表示。为了清楚起见,让我们用金钱做一个类比。小数部分可能代表美分——一美元的小数部分。'cents'数据类型的范围是0到99。如果将8位无符号整数用于定点数学,那么小数部分将被分成256个可整除的部分。我希望这能解决问题。 最佳答案 给你://Asignedfixed-point16:16

c++ - 用 4 个复合字节构建一个 32 位 float

我正在尝试用它的4个复合字节构建一个32位float。有没有比使用以下方法更好(或更便携)的方法?#includetypedefunsignedcharuchar;floatbytesToFloat(ucharb0,ucharb1,ucharb2,ucharb3){floatoutput;*((uchar*)(&output)+3)=b0;*((uchar*)(&output)+2)=b1;*((uchar*)(&output)+1)=b2;*((uchar*)(&output)+0)=b3;returnoutput;}intmain(){std::cout

c++ - 即使 float 不精确,Excel 如何成功地将它们舍入?

例如,thisblog说0.005不完全是0.005,但将该数字四舍五入会产生正确的结果。我在C++中尝试了各种四舍五入,但在将数字四舍五入到某些小数位时都失败了。例如,Round(x,y)将x舍入为y的倍数。所以Round(37.785,0.01)应该给你37.79而不是37.78。我重新提出这个问题是为了向社区寻求帮助。问题在于float的不精确(37,785表示为37.78499999999)。问题是Excel如何解决这个问题?round()forfloatinC++中的解决方案对于上述问题是不正确的。 最佳答案 “Round

c++ - 在不使用 modf() 的情况下获取 float 的小数部分

我正在开发一个没有数学库的平台,所以我需要构建自己的工具。我目前获取分数的方法是将float转换为定点(乘以(float)0xFFFF,强制转换为int),仅获取下部(掩码为0xFFFF)并再次将其转换回float。但是,不精确正在杀死我。我正在使用我的Frac()和InvFrac()函数来绘制抗锯齿线。使用modf我得到一条非常平滑的线。使用我自己的方法,由于精度损失,像素开始跳动。这是我的代码:constfloatfp_amount=(float)(0xFFFF);constfloatfp_amount_inv=1.f/fp_amount;inlinefloatFrac(float