草庐IT

GL_HALF_FLOAT

全部标签

c++ - AVX 将 64 位整数转换为 64 位 float

我想使用AVX将4个打包的64位整数转换为4个打包的64位float。我试过类似的东西:int_64t*ls=(int64_t*)_mm_malloc(256,32);ls[0]=a;//...ls[3]=d;__mm256ipacked=_mm256_load_si256((__m256iconst*)ls);将在调试器中显示:(gdb)printpacked$4={1234,5678,9012,3456}到目前为止还好,但我能找到的唯一转换/转换操作是_mm256i_castsi256_pd,它无法满足我的要求:__m256dpd=_mm256_castsi256_pd(packe

c++ - 如何在现代 C++ 中将 float 转换为 int

尽管看起来很奇怪,但我找不到如何将float干净地转换为int。这个技巧intint_value=(int)(float_value+0.5);触发一个warning:useofold-stylecast在海合会中。那么,将float转换为int的现代风格的简单方法是什么?(我当然接受精度的损失) 最佳答案 正如Josh在评论中指出的那样,+0.5不是很可靠。为了额外的安全,您可以像这样将static_cast与std::round结合起来:intint_value=static_cast(std::round(float_valu

c++ - Raspberry Pi ARM Float ABI 兼容性

我目前正在我的Ubuntu机器上对RaspberryPi执行一些交叉编译测试。我目前的理解是RaspberryPi支持硬件浮点,默认的RaspbianOS镜像是使用硬件浮点(armhf)构建的。正确吗?如果我使用“arm-linux-gnueabi”工具链(未指定任何ARM标志)构建我的应用程序,那么我的应用程序将使用软浮点ABI。正确吗?在这种情况下,我的所有依赖项也必须使用相同的ABI才能正确链接。正确吗?如果我的应用程序使用软浮点ABI,那么我的应用程序肯定链接到软浮点ABI共享标准库。当我在我的RaspberryPi上运行我的应用程序时,一切都按预期工作。如果Raspbian使

c++ - 运算符 + 和 float 参数

我对模板有一个奇怪的问题,我正在尝试在两者之间进行基本添加一个模板类和“float/double/int”类型。这是非常基本的,但如果我这样做:templateclasstoto{Ta;};templatetotooperator+(totoconst&,T&){std::coutt;totod=t+2.3;}它不会编译,因为2.3被认为是double的,它与签名不匹配。我可以为我的operator+使用第二个模板参数作为templatetotooperator+(totoconst&,D&){std::cout它编译、执行正确但太危险D可以是一切。另一种方法是使用float、doub

c++ - SSE 内在函数 : masking a float and using bitwise and?

基本上这个问题与x86汇编器有关,您有一个数字,您希望使用and将其设置为零或数字本身。.如果你andnumber为负数你会得到number本身,但如果你and它与零你得到零。现在我在使用SSEinstrinsics时遇到的问题是float在二进制中与double不同(或者我弄错了)。无论如何,这是代码,我尝试使用各种float来掩盖第二个和第三个数字(分别为127.0f和99.0f),但没有成功。#include#includevoidprint_4_bit_num(constchar*label,__m128var){float*val=(float*)&var;printf("%

c++ - 确保 float 小于精确值

我想在C++中计算以下形式的总和floatresult=float(x1)/y1+float(x2)/y2+....+float(xn)/ynxi,yi都是整数。结果将是实际值的近似值。这个近似值小于或等于实际值是至关重要的。我可以假设我所有的值(value)观都是有限的和积极的。我试过在这个代码片段中使用nextf(,0)。cout.precision(15);floata=1.0f/3.0f*10;//31/3floatb=2.0f/3.0f*10;//62/3floataf=nextafterf(a,0);floatbf=nextafterf(b,0);cout如您所见,正确的解

C++ - float 组 vector

我目前正在尝试创建一个包含float组的vector。我过得很艰难。我有以下代码:floattestArray[4]={20,-3.14/2,5,-3.14/2};std::vectorinputVector;std::vector::iteratorit=inputVector.begin();inputVector.insert(it,testArray);我一直收到错误提示“数组必须用大括号括起来的初始化器初始化”和“无效的数组赋值”。我用一个整数vector(而不是一个数组vector)尝试了同样的代码,但没有任何问题。我认为存在一个我不理解的潜在问题。感谢任何帮助!

c++ - 为什么 cout.setf(ios::fixed) 将我的 float 更改为十六进制?

我最近遇到了这个与cout.setf(ios::fixed)有关的奇怪问题。我花了很长时间才找到原因,我想我会在这里询问以了解更多信息。问题在于-使用cout.setf(ios::fixed)时,所有float都打印为十六进制数。为什么会这样?ios::base的文档似乎并不暗示这会发生(至少对我而言)。我使用的是g++5.3.0,下面粘贴的是一个最小示例和输出。#include#includeusingnamespacestd;intmain(intargc,charconst*argv[]){complexI(0.0,1.0);doublepi=M_PI;cout.setf(ios

c++ - 将 float 转换为 bigint(也称为获取二进制指数和尾数的可移植方式)

在C++中,我有一个bigint类,它可以容纳任意大小的整数。我想将大float或double转换为bigint。我有一个工作方法,但有点hack。我使用IEEE754数字规范来获取输入数字的二进制符号、尾数和指数。代码如下(这里忽略符号,不重要):floatinput=77e12;bigintresult;//extractsign,exponentandmantissa,//accordingtoIEEE754singleprecisionnumberformatunsignedint*raw=reinterpret_cast(&input);unsignedintsign=*ra

c++ - 正确地(独立于 32 位/64 位)将 float 保存到二进制 ofstream

显然在我的机器上,float、double和longdouble各有不同的大小。似乎也没有严格的标准来强制执行每种类型必须有多少字节。然后,如何将浮点值保存到二进制文件中,然后在大小不同的情况下在不同的系统上正确读取它?例如,我的机器有8个字节的double,而乔的有12个字节的double。无需以文本形式导出(例如“0.3232”),也就是说。看起来比二进制表示要紧凑得多。 最佳答案 你必须定义一个格式,并实现它。通常,大多数我知道的网络协议(protocol)使用IEEEfloat和double,输出big-endian(但其他