自定义浮点表示

时间:2014-05-28 02:43:46

标签: c# .net parsing floating-point data-processing

我正在尝试编写一个读取特定文件类型的解析器,我需要将不同的数据类型映射到C#等价物。他们中的大多数都不是那么困难,但是我无法绕过“具有偏差14的int16”的意思。我推断它是某种浮点类型,所以我最好的选择是编写一个转换器,将其映射为float,double或decimal类型。不过,我不知道从哪里拿它。

1 个答案:

答案 0 :(得分:2)

您似乎正在处理Excess-K notation

意译:

  

Excess-K使用预先指定的数字K作为偏差值。值是   由无符号数表示, K大于   预期价值。因此,0表示为K,-K表示为   全零位模式。

因此,如果您在文件中看到偏差为14的20,则需要将其转换为6。


关于这种表示的一些背景:一些早期表示首选的方案,其中所有零都是可能的最低值,并且所有零都是可能的最高值。

假设你有3位int并且只想表示[0,7]范围内的非负数,你的方案是让000代表0(最低值)和{{1}代表7(最高值)。在这种情况下,您的偏见将为0。

现在,如果你也希望能够代表-1。您需要通过将偏差设置为1来将您的值范围转换为[-1,6]。现在111代表-1,000代表6。


编辑:根据更新的信息

  

文档中此数据类型的完整描述   是“int16,偏差为14.这意味着它可以代表数字   介于1.999(0x7fff)和-2.0(0x8000)之间。 1.0存储为16384   (0x4000)和-1.0存储为-16384(0xc000)。

似乎我的编码方案想的精度16位为范围[-2,2)这是明显优于浮子对于特定的范围。您有4个线性数据点。我们知道范围是[-2,1.999],当前导位为1时,数字是负数。

111

为什么不在它们之间进行线性插值?

-2:     0x8000 (-32768)
-1:     0xc000 (-16384)
 0:     0x0 (0)
 1:     0x4000 (16384)
 1.999: 0x7fff (32767)