gpt4 book ai didi

c# - 可变精度浮点/ double 值

转载 作者:行者123 更新时间:2023-11-30 21:09:17 27 4
gpt4 key购买 nike

我有一个正在序列化的对象,其中包含我通过 protobuf-net 通过网络发送的大量 double 和 double 结构。问题是,我不需要那么精确。

例如,我有这样一个外部库返回 double 值的情况。

double Volts = Sampler.GetValue();//伏特值类似于 4.35(...)

但我真的只需要精确到小数点后两位。将其通过线路编码为 double 需要 64 位。将其编码为具有 2 位小数精度(“4.35”)的字符串实际上可能占用更少的空间。但是我在任何一方都有转换问题要处理。

我一直在研究 v2 选项,但我还没有看到这样的功能。如果您可以将浮点值编码为可变长度的精度,我可以看到它如何节省大量空间。

我考虑过将其乘以一个整数,然后将其转换回远端,但据我所知,这需要我对基类对象进行重大更改(而且我在反序列化期间使用合并选项)。

有什么想法或巧妙的解决方法吗?

顺便说一句,protobuf-net 非常棒,具有大量的可配置性。感谢您制作如此出色的程序。

最佳答案

进行“也许将它们发送为 float”的讨论,实际上您可以很容易地做到这一点;例如,如果您目前有:

[ProtoMember(4)]
public double Value {get;set;}

您可以将其更改为:

public double Value {get;set;} // this won't be serialized directly

[Protomember(4)] // but we'll use this private property for the serialization
private float ValueSingle {
get { return (float)Value; }
set { Value = value; }
}

它会在后台为你做垫片。此特殊更改也应该与现有数据兼容(尽管从技术上讲它确实更改了 .proto 模式,protobuf-net 相当宽容)。这将占用 4 个字节。另请注意,IEEE754 一如既往地适用,因此与 protobuf-net 完全无关不保证任何特定值(例如 4.35)可以完全存储。

如果您想要固定 精度,另一种选择是使用倍数。例如:

public double Value {get;set;}

[ProtoMember(4)]
public int ValueInt32 {
get { return (int)Math.Round(100 * Value); }
set { Value = value/100.0; }
}

您必须测试它是否与旧数据兼容……这是一个更大的变化。这里,4.35 将作为 435 发送,它占用 2 个字节作为“varint”。

关于c# - 可变精度浮点/ double 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9107010/

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