Rob*_*cks 5 c# floating-point binary numerical ieee-754
是的我知道IEEE-754半精度标准,是的,我知道在该领域所做的工作.非常简单地说,我试图只用2个字节保存一个简单的浮点数(比如52.1,或1.25).
我已尝试过Java和C#中的一些实现,但是它们通过解码不同的数字来破坏输入值.你可以在32.1编码解码后输入和输入32.0985.
有没有什么方法可以在不破坏输入值的情况下以16位存储浮点数?
非常感谢.
您可以在BCD中存储三位数字,并将剩余的四位用于小数点位置:
52.1 = 521 * 10 ^ -1 => 0x1521
1.25 = 125 * 10 ^ -2 => 0x2125
Run Code Online (Sandbox Code Playgroud)
这将为您提供从0.0000000000000001到999的范围.您当然可以为小数点添加偏移量,以获得例如0.0000000001到999000000的范围.
用于小数点放置的四位的简单实现,其余用于值.没有任何错误检查,并没有彻底检查.(!=用于比较双精度数时,可能会出现某些值的精度问题.)
public static short Encode(double value) {
int cnt = 0;
while (value != Math.Floor(value)) {
value *= 10.0;
cnt++;
}
return (short)((cnt << 12) + (int)value);
}
public static double Decode(short value) {
int cnt = value >> 12;
double result = value & 0xfff;
while (cnt > 0) {
result /= 10.0;
cnt--;
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
例:
Console.WriteLine(Encode(52.1));
Console.WriteLine(Decode(4617));
Run Code Online (Sandbox Code Playgroud)
输出:
4617
52.1
Run Code Online (Sandbox Code Playgroud)
C#没有内置功能,但您可以尝试使用定点方法.
8,8固定点的例子(逗号前8,后8):
float value = 123.45;
ushort fixedIntValue = (ushort)(value * 256);
Run Code Online (Sandbox Code Playgroud)
这样,数字存储如下:XXXXXXXX,XXXXXXXX
并且您可以使用以下方法再次检索浮动:
float value = fixedIntValue / 256f;
Run Code Online (Sandbox Code Playgroud)
您确定需要这样的微优化,而不仅仅是使用float或double?
通过存储short和理解,例如,它除以100来得到实际数字,你会得到更好的服务吗?(例如52.1和1.25的示例可以存储为5210和125)我认为这可能是最适合您的解决方案.
如果您使用的是实际浮点数,则可以将解码后的数字取整并将其四舍五入为有效数字(从您的示例中为3),这通常会使您返回与您开始时相同的数字(请注意是的,这是故意模糊的 - 你不能保证获得原件,除非你存储原件).
| 归档时间: |
|
| 查看次数: |
18605 次 |
| 最近记录: |