C#/ .net可以从字符串中解析指数十六进制编码的浮点数吗?

C ++,Java都在语言的语法中包含[ - ] 0xh.hhhhp +/- d格式,其他语言(如python和C99)也支持解析这些字符串(float.fromhex,scanf)。

我还没有找到一种在C#中使用.NET库解析这个精确的十六进制编码指数格式的方法。

有没有一种好的方法来处理这个问题,还是一个体面的替代编码? (十进制编码不准确)。

示例字符串:0x1p-8 -0xfe8p-12

谢谢


不幸的是,我不知道任何内置于.NET的方法与Python的float.fromhex()相比。 所以我想你唯一能做的就是在C#中自己编写.fromhex()。 这项任务的难度可能从“有点容易”到“非常困难”,具体取决于您希望解决方案的完善程度和优化程度。

正式的,IEEE 754规范允许十六进制系数内的小数(即0xf.e8p-12),这为我们增加了一层复杂性,(对我来说很沮丧).NET也不支持Double.Parse()用于十六进制字符串。

如果您可以将问题限制为您提供的只有整数作为系数的示例,则可以使用字符串操作使用以下解决方案:

public static double Parsed(string hexVal)
{
    int index = 0;
    int sign = 1;
    double exponent = 0d;

    //Check sign
    if (hexVal[index] == '-')
    {
        sign = -1;
        index++;
    }
    else if (hexVal[index] == '+')
        index++;
    //consume 0x
    if (hexVal[index] == '0')
    {
        if (hexVal[index+1] == 'x' || hexVal[index+1] == 'X')
            index += 2;
    }

    int coeff_start = index;
    int coeff_end = hexVal.Length - coeff_start;

    //Check for exponent
    int p_index = hexVal.IndexOfAny(new char[] { 'p', 'P' });
    if (p_index == 0)
        throw new FormatException("No Coefficient");
    else if (p_index > -1)
    {
        coeff_end = p_index - index;
        int exp_start = p_index + 1;
        int exp_end = hexVal.Length;
        exponent = Convert.ToDouble(hexVal.Substring(exp_start, exp_end - (exp_start)));
    }

    var coeff = (double)(Int32.Parse(hexVal.Substring(coeff_start, coeff_end), NumberStyles.AllowHexSpecifier));
    var result = sign * (coeff * Math.Pow(2, exponent));
    return result;
}

如果你正在寻找与Python的fromhex()相同的函数,你可以尝试将CPython实现转换为C#,如果你愿意的话。 我试了一下,但是因为我对标准不是很熟悉,并且遇到了所有的溢出检查,所以他们一直在寻找。 他们还允许其他的东西,如无限的前导和尾随空白,这是我的解决方案不允许的。

我的解决方案是“有点容易”的解决方案。 我猜如果你真的知道你的东西,你可以在比特级上建立符号,指数和尾数,而不是把所有东西都放大。 你也可以一次完成,而不是使用.Substring()方法作弊。

希望这至少能让你走上正轨。


我已经编写了C#代码,用于格式化和解析IEEE 754r中描述的并且由C99,C ++ 11和Java支持的十六进制浮点格式的数字。 该代码是F#BSD许可的FParsec库的一部分,并包含在单个文件中:https://bitbucket.org/fparsec/main/src/tip/FParsecCS/HexFloat.cs

支持的格式在http://www.quanttec.com/fparsec/reference/charparsers.html#members.floatToHexString中有所描述

测试代码(用F#编写)可以在https://bitbucket.org/fparsec/main/src/tip/Test/HexFloatTests.fs找到。

链接地址: http://www.djcxy.com/p/11423.html

上一篇: Can C#/.net parse exponential hex encoded floating point numbers from strings?

下一篇: Difficult Marshalling DirectX array of structs from C++ to C#