如何保存flat16(https://en.wikipedia.org/wiki/Half-precision_floating-point_format)最大数量在flat32(https://en.wikipedia.org/wiki/Single-precision_floating-point_format)格式?
我想有一个可以将0x7bff转换为65504的函数。0x7bff是可以用浮点半精度表示的最大值:
0 11110 1111111111 -> decimal value: 65504
我希望有0x7bff来表示我的程序中的实际位。
float fp16_max = bit_cast(0x7bff);
# want "std::cout << fp16_max" to be 65504
我试图实现这样一个功能,但似乎不起作用:
float bit_cast (uint32_t fp16_bits) {
float i;
memcpy(&i, &fp16_bits, 4);
return i;
}
float test = bit_cast(0x7bff);
# print out test: 4.44814e-41
如何以float32格式保存float16最大值?
65504
您只需将整数转换为浮点:
float half_max = 65504;
如果要计算该值,可以使用ldexpf:
float half_max = (2 - ldexpf(1, -10)) * ldexpf(1, 15)
或者,对于任何IEEE浮点:
// in case of half float
int bits = 16;
int man_bits = 10;
// the calculation
int exp_bits = bits - man_bits - 1;
int exp_max = (1 << (exp_bits - 1)) - 1;
long double max = (2 - ldexp(1, -1 * man_bits)) * ldexp(1, exp_max);
位转换0x7bff不起作用,因为0x7bff是二进制16格式(在某些端序中)的表示,而不是二进制32格式。不能对冲突表示进行位转换。
通过声明,您的值已经是32位浮点;不需要在这里施放。我想你可以简单地:
float i = fp16_max;
这里的假设是您的“魔法”bit_cast
函数已经正确返回了一个32位浮点数。由于您还没有向我们展示bit-cast
做了什么或实际返回了什么,我将假设它确实返回了一个正确的浮点数
值。
#include <cmath>
#include <cstdio>
/* Decode the IEEE-754 binary16 encoding into a floating-point value.
Details of NaNs are not handled.
*/
static float InterpretAsBinary16(unsigned Bits)
{
// Extract the fields from the binary16 encoding.
unsigned SignCode = Bits >> 15;
unsigned ExponentCode = Bits >> 10 & 0x1f;
unsigned SignificandCode = Bits & 0x3ff;
// Interpret the sign bit.
float Sign = SignCode ? -1 : +1;
// Partition into cases based on exponent code.
float Significand, Exponent;
// An exponent code of all ones denotes infinity or a NaN.
if (ExponentCode == 0x1f)
return Sign * (SignificandCode == 0 ? INFINITY : NAN);
// An exponent code of all zeros denotes zero or a subnormal.
else if (ExponentCode == 0)
{
/* Subnormal significands have a leading zero, and the exponent is the
same as if the exponent code were 1.
*/
Significand = 0 + SignificandCode * 0x1p-10;
Exponent = 1 - 0xf;
}
// Other exponent codes denote normal numbers.
else
{
/* Normal significands have a leading one, and the exponent is biased
by 0xf.
*/
Significand = 1 + SignificandCode * 0x1p-10;
Exponent = ExponentCode - 0xf;
}
// Combine the sign, significand, and exponent, and return the result.
return Sign * std::ldexp(Significand, Exponent);
}
int main(void)
{
unsigned Bits = 0x7bff;
std::printf(
"Interpreting the bits 0x%x as an IEEE-754 binary16 yields %.99g.\n",
Bits,
InterpretAsBinary16(Bits));
}
本文向大家介绍C ++中数组中存在的最大连续数,包括了C ++中数组中存在的最大连续数的使用技巧和注意事项,需要的朋友参考一下 给定一个正整数数组。目的是找到其中存在的最大连续数。首先,我们将对数组进行排序,然后比较相邻元素arr [j] == arr [i] +1(j = i + 1),如果差为1,则递增计数,索引i ++,j ++,否则更改计数= 1 。将到目前为止找到的最大计数存储在maxc
我尝试通过像这样更改if语句来只获得最长的回文。 这并不像预期的那样有效。我只打印第一个回文[“w”],然后在列表中返回整个字符串[“w”,“h”,...]
我需要在数据库中按kb保存大小,以便在前端查看,这是我正在使用的控制器。我使用的是Laravel 5.8 所以我的问题是,拉雷维尔是否提供了处理这种情况的任何假象?或者任何其他框架都有更适合问题的功能是什么?
当用户关闭一个程序时,我想保存一些关于主窗口的信息,以便下次用户打开程序时,窗口具有相同的属性。 这对于窗口是否最大化很容易做到: 得到:舞台。isMaximized() 场景:舞台。setMaximized(布尔最大化) 如果窗口没有最大化,这也很容易做到: 得到:舞台。getX()/stage。getY()/舞台。getWidth()/stage。getHeight() 场景:舞台。setX(
问题内容: 我有一些将数据存储在页面中的表格。我想找到一种方法来临时保存用户在导航中输入的数据,并保持到确认订单为止。谁能帮我? 问题答案: 这正是会议的目的
我一直在做一些实验,使用一些变换,例如在Matlab中对图像数据进行DCT变换。使用512x512像素lena图像的DCT示例: x=双(imread('lenna.bmp'));R=dct2(x); 然后,我想通过保持R的100000个最大系数并将剩余的设置为零来阈值变换系数。 我该怎么做?