- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要将几个 float 写入一个文本文件并存储一个 CRC32 校验和。然后,当我从文本文件中读回 float 时,我想重新计算校验和并将其与之前保存文件时计算的校验和进行比较。我的问题是校验和有时会失败。这是因为相等的 float 可以用不同的位模式表示。为了完整起见,我将在接下来的段落中总结代码。
我已经改编了this CRC32 algorithm这是我阅读后发现的 this question .这是它的样子:
uint32_t updC32(uint32_t octet, uint32_t crc) {
return CRC32Tab[(crc ^ octet) & 0xFF] ^ (crc >> 8);
}
template <typename T>
uint32_t updateCRC32(T s, uint32_t crc) {
const char* buf = reinterpret_cast<const char*>(&s);
size_t len = sizeof(T);
for (; len; --len, ++buf)
crc = updC32(static_cast<uint32_t>(*buf), crc);
return crc;
}
CRC32Tab
包含与上面链接文件中的大数组完全相同的值。
这是我如何将 float 写入文件并计算校验和的简化版本:
float x, y, z;
// set them to some values
uint32_t crc = 0xFFFFFFFF;
crc = Utility::updateCRC32(x, crc);
crc = Utility::updateCRC32(y, crc);
crc = Utility::updateCRC32(z, crc);
const uint32_t actualCrc = ~crc;
// stream is a FILE pointer, and I don't mind the scientific representation
fprintf(stream, " ( %g %g %g )", x, y, z);
fprintf(stream, " CRC %u\n", actualCrc);
我从文件中读回值如下。由于文件具有更复杂的语法并且必须进行解析,因此实际上涉及的内容更多,但我们假设 getNextFloat()
返回之前编写的每个 float 的文本表示形式。
float x = std::atof(getNextFloat());
float y = std::atof(getNextFloat());
float z = std::atof(getNextFloat());
uint32_t crc = 0xFFFFFFFF;
crc = Utility::updateCRC32(x, crc);
crc = Utility::updateCRC32(y, crc);
crc = Utility::updateCRC32(z, crc);
const uint32_t actualCrc = ~crc;
const uint32_t fileCrc = // read the CRC from the file
assert(fileCrc == actualCrc); // fails often, but not always
这个问题的根源是 std::atof 将返回从文件读取的字符串中编码的 float 的不同位表示,而不是用于将该字符串写入文件。
所以,我的问题是:除了对字符串本身进行校验和之外,还有另一种方法可以实现我的校验和 float 的目标吗?
感谢阅读!
最佳答案
问题的根源从您的评论中显而易见:
If I'm not completely mistaken, there is no rounding happening here. The
%g
specifier chooses the shortest string representation that exactly represents the number.
这是不正确的。如果未指定精度,则默认为 6,并且对于大多数浮点输入,肯定会进行舍入。
如果您需要一种人类可读的可往返格式,%a
是迄今为止最好的选择。如果做不到这一点,您将需要指定至少 9 的精度(假设您系统上的 float
是 IEEE-754 单精度)。
您可能仍然被 NaN 编码绊倒,因为标准没有指定如何或是否必须打印它们。
关于c++ - 通过文本文件往返的 float 校验和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15429593/
考虑以下示例: >>> from IPython.core.inputtransformer2 import TransformerManager >>> src = """\ ... foo = !
所以我构建 Django 应用程序已经有一段时间了,喝了很酷的东西:只使用 ORM,从不编写自定义 SQL。 一旦您拥有大量用户特定内容(即照片、 friend 、其他数据等),网站的主页(用户将花费
我想使用 Excel 的 XML Map Web 应用程序中来自服务器端 C# 的功能。 XML 映射使您能够将 XML 架构与工作簿相关联,并指定哪些单元格映射到架构的哪些部分。您可以从那里导入 X
Closed. This question needs to be more focused。它当前不接受答案。
我有一个简单但具有挑战性的算法问题要解决。 我有一个交易员 - 股票 - 日级别的数据集,我想识别数据中的往返行程。往返只是数据中的特定序列。也就是说,如果您随着时间的推移累积个人 i 的股票 s 持
是否有一种可靠的方法可以将 HTTP cookie 值精确往返一次? 例如 Set-Cookie: name=value; Max-Age=1; ...但 Max-Age 以增量秒为单位而不是 #re
随着 Swift 3 倾向于 Data而不是 [UInt8] ,我试图找出将各种数字类型(UInt8、Double、Float、Int64 等)编码/解码为 Data 对象的最有效/惯用方法。 有th
我有一个具有以下结构的小部件(它是“计划选择器”简历): 我的指令如下: plans.directive('resume', function()
我们观察到所有消息的 RTT Kafka 延迟较高。 这是我们的实际配置: 我们有 3 个 Kafka 代理 + 3 个 Zookeeper 在 EC2 服务器上的 Kubernetes 集群中运行
使用 Newtonsoft.Json 库,想象一下 public class Test { public Object Obj { get; set; } } 现在,尝试像这样序列化它 var
这里和网络上有很多文章,但这些文章都针对不同的 Objectify 版本,并且由于某种原因似乎不起作用。 我有一个实体,它引用另一个实体(例如,帐户实体引用用户实体): @Cache @Entity
问题:当 SubSonic 对象通过 Windows Communication Foundation 服务来回发送时,如何保留它们的“脏”? 即: 我有一个返回 SubSonic (2.2) 对象集
我想使用 golang 的 xml.MarshalIndent() 快速创建一个实用程序来格式化任何 XML 数据 但是this code package main import ( "enc
我需要有关子流程模块的帮助。这个问题听起来可能是重复的,而且我已经在很多方面看到过很多与之相关的文章。但即便如此我也无法解决我的问题。其过程如下: 我有一个C程序2.c,其内容如下: #include
在尝试创建一些 FFI 帮助程序代码时,我对 Box 这种看似简单的用法感到头疼。 当与具有字段的结构一起使用时,此处的示例似乎给出了 free(): invalidpointer 错误。 pub s
我有两个函数用于在 Blob 和字节数组之间进行转换: function arrayToBlob(data) { return new Blob(data); } function blobT
我一直在尝试将带有 INTO OUTFILE 的 mysql 表导出为 CSV 以便在 Excel 中进行编辑,然后使用 LOAD DATA INFILE 插入回 mysql。 我可以导出 ok,甚至
我正在 Web 服务中实现条件请求。后端可以轻松检索实体的最后修改日期,因此我发送 Last-Modified 并返回 If-Modified-Since。 RFC for HTTP Dates指定与
我正试图找到一种方法来完成 xsd 模式到数据存储区的往返,而工作量最小。 我使用 jaxb 从模式构建我的对象模型,现在我想基于 JPA(或 JDO 或其他?)存储这些对象。是否可以根据 JAXB
我正在使用 DataAnnotations、jQuery.validate 和 jquery.validate.unobtrusive 创建一个日期范围验证器。我已经阅读了以下内容: http://b
我是一名优秀的程序员,十分优秀!