首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gRPC中的协议缓冲区不能保存大的浮点数--该怎么办?

gRPC中的协议缓冲区不能保存大的浮点数--该怎么办?
EN

Stack Overflow用户
提问于 2017-09-05 08:37:08
回答 2查看 2.6K关注 0票数 0

我使用的协议缓冲区与gRPC。我的.proto文件看起来像

代码语言:javascript
复制
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;
}

但这个制度似乎削弱了我的价值观:

代码语言:javascript
复制
>>> dtw_rpc_pb2.CycleData(timestamps=[1501545616.742662], values=[5])
timestamps: 1501545600.0
values: 5.0

我想它不能准确地表示那些大的值:

代码语言:javascript
复制
>>> 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

我能做什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-05 09:49:54

文档有一点误导(它意味着对Python的转换独立于proto类型,因此我认为它不会有帮助),但是如果使用"double“,它就会工作。

所以,我需要改变

代码语言:javascript
复制
message CycleData {
  repeated float timestamps = 1;
  repeated float values = 2;
}

代码语言:javascript
复制
message CycleData {
  repeated double timestamps = 1;
  repeated float values = 2;
}

背景是,正如罗洁在评论中所解释的那样,Python的float实际上已经具有双精度。没有C风格的浮点数。另一方面,Protobuf确实承认"float“和"double”是不同的类型。使用Protobuf的双重类型实际上与Python的float相同,而Protobuf的float将降低精度,从而导致问题中描述的问题。

票数 2
EN

Stack Overflow用户

发布于 2017-09-06 21:06:32

对于纯python protobuf,python用于float和double。但是cpp实现调用了一些C++原型代码,使得它与纯python不同。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46050535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档