gpt4 book ai didi

c# - native C# : Reconstructing a Decimal number from its bit representation

转载 作者:行者123 更新时间:2023-11-30 22:01:13 25 4
gpt4 key购买 nike

typedef struct
{
union {
uint32_t ss32;
struct {
unsigned int reserved1 : 16;
unsigned int scale : 8;
unsigned int reserved2 : 7;
unsigned int sign : 1;
} signscale;
} u;
uint32_t hi32;
uint32_t lo32;
uint32_t mid32;
} decimal_repr;

鉴于 Decimal 结构,我如何将其内部数据重建为人类可读的数字,例如 123456.987654000123456 ?我找不到任何解释十进制结构的文档(左移或右移多少位,分数,尾数等)。

我还发现 Decimal 类链接到 libdec 但我无法在项目源代码中的任何地方找到该库。如果有的话,我当然只想重用它。

编辑

我仍然卡在两个问题上:

  1. 如果我使用上面的公式来计算最终输出结果,那么看起来我又回到了普通的内置类型(例如 10000/3.0 = 333.3333)的正常计算(mult,div,pow),其中默认情况下,编译器会限制位数。
  2. 在十进制类中,我只有 4 个私有(private)成员(lo、hi、mid、flags),其中 flagsscale 的 16 位左移值在上述结构中定义;并且如果输入值为负,则必须屏蔽标志或将其最低有效位值设置为 0x8000000。现在有了上面的结构数据,我想初始化 Decimal 类成员,尤其是 flags。当然,我可以将 scale 值右移 16 位以获得 flags 但如果 sign 为 1,即负输入值,我我对的逆运算很愚蠢标志|=0x8000000。也就是说,从先前移位的标度中消除最低有效位值以获得原始 flags

最佳答案

(-1)^sign*(hi32*2^64+mid32*2^32+lo32)/10^scale

The binary representation of a Decimal number consists of a 1-bit sign, a 96-bit integer number, and a scaling factor used to divide the integer number and specify what portion of it is a decimal fraction. The scaling factor is implicitly the number 10 raised to an exponent ranging from 0 to 28. MSDN

编辑:

  1. 你必须以某种方式处理长算术。 Decimal 是最大的内置数字类型,因此您无法在其他内置类型的单个变量中表示所有可能的十进制值。
  2. 不完全理解您的问题。 decimal_repr 直接对应于 Decimal 结构,它有相同的顺序相同的字段。 flags对应ss32hi对应hi32lo对应lo32 midmid32。所以如果你有你的数据结构,那么你已经有了 Decimal 结构,不需要转换。如果你想从 flags 中清除 sing 标志,那么你可以这样做:flags&=0x7fffffff

关于c# - native C# : Reconstructing a Decimal number from its bit representation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27894978/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com