Mik*_*and 7 .net c# floating-point parsing
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;
}
Run Code Online (Sandbox Code Playgroud)
如果您正在寻找与 Python 的 fromhex() 相同的函数,您可以尝试将CPython 实现转换为 C#(如果您愿意)。我尝试过,但由于我不太熟悉该标准,并且无法遵循他们正在寻找的所有溢出检查,因此陷入了困境。它们还允许其他事情,例如无限的前导和尾随空格,这是我的解决方案不允许的。
我的解决方案是“有点简单”的解决方案。我猜如果你真的了解你的东西,你可以在位级别构建符号、指数和尾数,而不是把所有东西相乘。您绝对也可以一次性完成此操作,而不是使用 .Substring() 方法作弊。
希望这至少能让你走上正轨。
| 归档时间: |
|
| 查看次数: |
894 次 |
| 最近记录: |