gRPC 中的协议缓冲区无法保存大浮点数 - 怎么办?
Protocol buffers in gRPC cannot save large float numbers - what to do?
我在 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
我能做什么?
documentation 有点误导(它暗示到 Python-float 的转换与原型类型无关,所以我认为这无济于事),但如果使用 "double" 有效。
所以,我需要改变
message CycleData {
repeated float timestamps = 1;
repeated float values = 2;
}
到
message CycleData {
repeated double 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++ protobuf 代码,使其与纯 python.
不同
我在 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
我能做什么?
documentation 有点误导(它暗示到 Python-float 的转换与原型类型无关,所以我认为这无济于事),但如果使用 "double" 有效。
所以,我需要改变
message CycleData {
repeated float timestamps = 1;
repeated float values = 2;
}
到
message CycleData {
repeated double 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++ protobuf 代码,使其与纯 python.
不同