Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python gRPC中的协议缓冲区无法保存大浮点数-怎么办?_Python_Protocol Buffers_Grpc - Fatal编程技术网

Python gRPC中的协议缓冲区无法保存大浮点数-怎么办?

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

我正在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 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;
}