我最近一直在研究需要存储和加载大量数据的系统,包括单精度浮点值.我决定对整数进行网络字节顺序的标准化,并决定以大尾数格式存储浮点值,即:
|-- Byte 0 --| |-- Byte 1 -|  Byte 2   Byte 3
  #      ####### #     ####### ######## ########
Sign     Exponent          Mantissa
 1b    8b,MSB first    23b,MSB first

理想情况下,我想提供像htonl()和ntohl()这样的功能,因为我已经使用这些函数来擦除整数,而且我也希望以尽可能多的平台独立性的方式来实现浮点类型对应于IEEE754 32位浮点值).有没有办法,可能使用ieee754.h这样做?

我有一个似乎有效的答案,我会把它放在下面,但它看起来很慢,效率低下,我会感谢任何关于如何使它更快和/或更可靠的建议.

解决方法

更简单,并且取决于与您相同的假设(这是float和整数类型具有相同的字节顺序,并且几乎是普遍有效的 – 实际上,你永远不会遇到不真实的系统):
#include <string.h>

float htonf(float val) {
    uint32_t rep;
    memcpy(&rep,&val,sizeof rep);
    rep = htonl(rep);
    memcpy(&val,&rep,sizeof rep);
    return val;
}

任何相当不错的编译器都会优化两个memcpy调用;它们存在于击败过度严格的混叠优化,因此最终可以像htonl加上单个函数调用的开销一样有效.

c – IEEE754浮点值的便携序列化的更多相关文章

  1. 从IOS / iPad / iPhone的最大速度

    我使用OpenCVforiOS完成计算密集型应用程序.当然这很慢.但它比我的PC原型慢了200倍.所以我正在优化它.从最初的15秒,我能够获得0.4秒的速度.我想知道我是否找到了所有的东西以及别人想要分享的东西.我做了什么:>将OpenCV中的“double”数据类型替换为“float”.双倍是64位,32位cpu不能轻易处理,所以浮动给了我一些速度.OpenCV经常使用双倍.>为编译器选项添加了

  2. 如何在iOS中使用GL_HALF_FLOAT_OES类型的纹理?

    谢谢!

  3. 在iOS ARM设备(iPhone 4)上支持非正常IEEE 754浮点数

    >可以将iOS系统设置为提供对正常数量的支持,而不要求编译器仅生成完整的软件浮点代码?是.这可以通过将FPSCR中的FZ位设置为零来实现:请注意,当遇到可观量的非正常值时,这可能会导致应用程序性能的显着下降.您可以恢复默认浮点状态,然后再调用任何不使ABI保证在非默认模式下正常工作的代码:请提交bugreport请求,为iOS中的FP操作模式提供更好的文档.

  4. ios – CGPath和UIBezierPath()有什么区别?

    目前,我正在努力制作一个自定义按钮,我有一个图像,并具有坐标,但我发现您可以通过使用CGPath类或UIBezierPath创建一个按钮/对象类.有人可以告诉我两者有什么区别?解决方法CGPath是CoreGraphics库的不透明类型,而UIBezierPath是UIKit中的Obj-C类.UIBezierPath是一个围绕CGPath的包装,具有更加面向对象的界面和一些方便的方法.使用CGPath可能会略微更快,因为它不必经过Obj-C,并且它具有更高级的功能,如CGPathApply.重要的是,UI

  5. ios – 舍入集合视图的浮点值时出错

    我想在我的设备上摆脱一个像素问题.我正在设计一个如下所示的日历我正在为此目的使用UICollectionViewCell问题是,如果我增加宽度甚至0.0000001点,那么每行绘制的单元格数量是6而不是7.我已尝试增加UIEdgeInset(0.00001),但这是同样的问题.流布局的属性已正确设置.如何在不留空隙的情况下使单元尺寸保持一致?电池的实际宽度为53.571428571428569(3

  6. Swift教程05-基本数据类型(一)整型浮点型

    Swift的基本数据类型与Oc的数据类型有一些不同;除了写法改变了一些之外,还增加了一些类型,下面来由浅入深的介绍其基本数据类型注意:基本数据类型以大写字母开头,不同于C语言!

  7. swift基本语法—变量和常量—整型-浮点型 -布尔型 bool

    swift基本语法——变量和常量swift语言中声明变量使用var关键字,声明常量使用let关键字importFoundationvarStr="helloworld"//Str是变量varnum:StringletInstrationCount:Int=2//InstrationCount是常量vartemp:Float32=2.8//Str=1024//编译会失败,不能修改常量//varNum

  8. Swift学习笔记二十三——Swift泛型初识

    泛型的概念在Java中也是存在的,泛型可以使代码更为精炼,是对数据类型使用的一种优化。如果此时又多了一个需求,需要判断两个浮点型的是否相等。那怎么办,代码实现基本和上面一样,不过我们又得重新写一遍浮点型的代码:。以上两个代码将会导致代码可重用性变差且变得冗余,如果使用泛型来实现,将会变得很简单:.泛型的实现是不是很高大上呢。让我们的代码也提升B格吧。

  9. Swift 2.0学习笔记Day 13——数据类型之整型和浮点型

    浮点型主要用来储存小数数值,也可以用来储存范围较大的整数。它分为浮点数和双精度浮点数两种,双精度浮点数所使用的内存空间比浮点数多,可表示的数值范围与精确度也比较大。欢迎关注关东升新浪微博@tony_关东升。

  10. Swift快速入门-2-型别安全及推断、整点浮点转换

    本文参考Apple官网文档,仅是快速学习的笔记,写的不是太详细,想看想详细点的请见http://www.apple.com/swift/下方有原文下载,国内也有很多翻译的好文章=============letiNumber=38会自动推断为Int类型letpi=3.1415926会推断为Doubler而不是Float===和C#不同的是,会自动推断计算过后的值,如果超过可储存的范围会编译错误,如:

随机推荐

  1. 从C到C#的zlib(如何将byte []转换为流并将流转换为byte [])

    我的任务是使用zlib解压缩数据包(已接收),然后使用算法从数据中生成图片好消息是我在C中有代码,但任务是在C#中完成C我正在尝试使用zlib.NET,但所有演示都有该代码进行解压缩(C#)我的问题:我不想在解压缩后保存文件,因为我必须使用C代码中显示的算法.如何将byte[]数组转换为类似于C#zlib代码中的流来解压缩数据然后如何将流转换回字节数组?

  2. 为什么C标准使用不确定的变量未定义?

    垃圾价值存储在哪里,为什么目的?解决方法由于效率原因,C选择不将变量初始化为某些自动值.为了初始化这些数据,必须添加指令.以下是一个例子:产生:虽然这段代码:产生:你可以看到,一个完整的额外的指令用来移动1到x.这对于嵌入式系统来说至关重要.

  3. 如何使用命名管道从c调用WCF方法?

    更新:通过协议here,我无法弄清楚未知的信封记录.我在网上找不到任何例子.原版的:我有以下WCF服务我输出添加5行,所以我知道服务器是否处理了请求与否.我有一个.NET客户端,我曾经测试这一切,一切正常工作预期.现在我想为这个做一个非托管的C客户端.我想出了如何得到管道的名称,并写信给它.我从here下载了协议我可以写信给管道,但我看不懂.每当我尝试读取它,我得到一个ERROR_broKEN_P

  4. “这”是否保证指向C中的对象的开始?

    我想使用fwrite将一个对象写入顺序文件.班级就像当我将一个对象写入文件时.我正在游荡,我可以使用fwrite(this,sizeof(int),2,fo)写入前两个整数.问题是:这是否保证指向对象数据的开始,即使对象的最开始可能存在虚拟表.所以上面的操作是安全的.解决方法这提供了对象的地址,这不一定是第一个成员的地址.唯一的例外是所谓的标准布局类型.从C11标准:(9.2/20)Apointe

  5. c – 编译单元之间共享的全局const对象

    当我声明并初始化一个const对象时.两个cpp文件包含此标头.和当我构建解决方案时,没有链接错误,你会得到什么如果g_Const是一个非const基本类型!PrintInUnit1()和PrintInUnit2()表明在两个编译单元中有两个独立的“g_Const”具有不同的地址,为什么?

  6. 什么是C名称查找在这里? (&amp;GCC对吗?)

    为什么在第三个变体找到func,但是在实例化的时候,原始变体中不合格查找找不到func?解决方法一般规则是,任何不在模板定义上下文中的内容只能通过ADL来获取.换句话说,正常的不合格查找仅在模板定义上下文中执行.因为在定义中间语句时没有声明func,并且func不在与ns::type相关联的命名空间中,所以代码形式不正确.

  7. c – 在输出参数中使用auto

    有没有办法在这种情况下使用auto关键字:当然,不可能知道什么类型的.因此,解决方案应该是以某种方式将它们合并为一个句子.这可用吗?解决方法看起来您希望默认初始化给定函数期望作为参数的类型的对象.您无法使用auto执行此操作,但您可以编写一个特征来提取函数所需的类型,然后使用它来声明您的变量:然后你就像这样使用它:当然,只要你重载函数,这一切都会失败.

  8. 在C中说“推动一切浮动”的确定性方式

    鉴于我更喜欢将程序中的数字保留为int或任何内容,那么使用这些数字的浮点数等效的任意算术最方便的方法是什么?说,我有我想写通过将转换放在解析的运算符树叶中,无需将表达式转化为混乱是否可以使用C风格的宏?应该用新的类和重载操作符完成吗?解决方法这是一个非常复杂的表达.更好地给它一个名字:现在当您使用整数参数调用它时,由于参数的类型为double,因此使用常规的算术转换将参数转换为double用C11lambda……

  9. objective-c – 如何获取未知大小的NSArray的第一个X元素?

    在objectiveC中,我有一个NSArray,我们称之为NSArray*largeArray,我想要获得一个新的NSArray*smallArray,只有第一个x对象…

  10. c – Setprecision是混乱

    我只是想问一下setprecision,因为我有点困惑.这里是代码:其中x=以下:方程的左边是x的值.1.105=1.10应为1.111.115=1.11应为1.121.125=1.12应为1.131.135=1.14是正确的1.145=1.15也正确但如果x是:2.115=2.12是正确的2.125=2.12应为2.13所以为什么在一定的价值是正确的,但有时是错误的?请启发我谢谢解决方法没有理由期望使用浮点系统可以正确地表示您的帖子中的任何常量.因此,一旦将它们存储在一个双变量中,那么你所拥有的确切的一

返回
顶部