Python gRPC中的协议缓冲区无法保存大浮点数-怎么办?
我正在gRPC中使用协议缓冲区。我的.proto文件看起来像Python gRPC中的协议缓冲区无法保存大浮点数-怎么办?,python,protocol-buffers,grpc,Python,Protocol Buffers,Grpc,我正在gRPC中使用协议缓冲区。我的.proto文件看起来像 syntax = "proto3"; option java_multiple_files = true; option objc_class_prefix = "DRPC"; package my_rpc; service RPCData { // Sends a cycle of data rpc RunRequest (CycleData) returns (OutputScores) {} } message
syntax = "proto3";
option java_multiple_files = true;
option objc_class_prefix = "DRPC";
package my_rpc;
service RPCData {
// Sends a cycle of data
rpc RunRequest (CycleData) returns (OutputScores) {}
}
message CycleData {
repeated float timestamps = 1;
repeated float values = 2;
}
但这个系统似乎削弱了我的价值观:
>>> dtw_rpc_pb2.CycleData(timestamps=[1501545616.742662], values=[5])
timestamps: 1501545600.0
values: 5.0
我想它无法准确地表示这些大值:
>>> dtw_rpc_pb2.CycleData(timestamps=[16.742662], values=[5])
timestamps: 16.74266242980957
values: 5.0
>>> dtw_rpc_pb2.CycleData(timestamps=[45616.742662], values=[5])
timestamps: 45616.7421875
values: 5.0
>>> dtw_rpc_pb2.CycleData(timestamps=[1545616.742662], values=[5])
timestamps: 1545616.75
values: 5.0
>>> dtw_rpc_pb2.CycleData(timestamps=[1501545616.742662], values=[5])
timestamps: 1501545600.0
values: 5.0
我能做什么?这有点误导,它意味着转换为Python浮点值独立于原型,因此我认为这不会有什么帮助,但如果使用double,它会起作用
所以,我需要改变
message CycleData {
repeated float timestamps = 1;
repeated float values = 2;
}
到
正如罗洁在评论中解释的那样,背景是Python的浮点实际上已经具有双精度。没有C型浮动。另一方面,Protobuf确实将float和double识别为不同的类型。使用Protobuf的double类型实际上与Python的float相同,而Protobuf的float会降低精度,从而导致问题中描述的问题。对于纯Python Protobuf,Python float用于float和double。但是CPP实现调用了一些C++原代码,使它与纯Python不同。你能详细说明一下吗?Python浮点是否比C++浮点编码更多字节?我想这两个都是用32字节编码的?什么是cpp?它是C++编译器吗?Python没有C样式浮点,它只有C样式的双。Python内置的浮点类型具有双精度。是的,CPP,我是指C++。CPP1实现是一个我们使用Python原型Bufff的标志,如果有人想要使用C++实现:我相信GRPC使用的是CPPY。implementation@Make42gRPC Python pip包,将protobuf pip包作为依赖项列出。根据PIP安装的平台,Python TimeBuF包加载两个底层代码路径之一,一个使用C++编写的Python扩展,另一个用Python编写。gRPC本身使用任何底层protobuf安装,并且对其中任何一种都很满意,但是您可能会遇到一些细微的行为差异。有一个PrimoLoopBuffsyPythOnLosithy= Python环境变量,即使在C++扩展可用时也会强制纯Python代码路径。@ MehrdadAfshari:这说明了很多,谢谢!你知道有什么不同吗?在哪里可以找到更多关于这个主题的信息?我想C++实现速度更快。@ MaX42我不确定这些差异是否完全被记录,因为目标是除了速度之外,它们的行为是相同的。如果您发现受支持的行为存在差异,则应将其视为一个bug,并为此提出一个问题。我想,如果没有一些折衷的话,这个问题可能不太容易解决。
message CycleData {
repeated double timestamps = 1;
repeated float values = 2;
}