在c中获取浮点数的指数

2024-04-03

抱歉,如果已经有人问过这个问题,并且我已经看到了提取浮点数指数的其他方法,但这就是给我的:

unsigned f2i(float f)
{
  union {
    unsigned i;
    float f;
  } x;
  x.i = 0;
  x.f = f;
  return x.i;
}

我无法理解这个联合数据类型,因为最后的 return x.i 不应该总是使 f2i 返回 0 吗?

另外,这种数据类型对什么应用程序有用?例如,假设我有一个函数:

int getexponent(float f){
}

该函数应该获取偏差为 127 的浮点数的指数值。我已经找到了很多方法来实现这一点,但是我如何操作 f2i 函数来达到此目的?

我很感激任何指点!

Update!!哇,几年后,这看起来微不足道。 对于那些可能感兴趣的人,这是这个功能!

int getexponent(float f) {
    unsigned f2u(float f); 
	unsigned int ui = (f2u(f)>>23) & 0xff ;//shift over by 23 and compare to 0xff to get the exponent with the bias 
	int bias = 127;//initialized bias 
	if(ui == 0) return 1-bias; // special case 0
	else if(ui == 255) return 11111111; //special case infinity
	return ui - bias;
}

我无法理解这个联合数据类型

联合数据类型是程序员指示某个变量可以是多种不同类型之一的方法。 C11标准的措辞有点像“一个联盟最多包含一个成员”。它用于诸如逻辑上可能是这样或那样的参数之类的东西。例如,IP 地址可能是 IPv4 地址或 IPv6 地址,因此您可以按如下方式定义地址类型:

struct IpAddress
{
    bool isIPv6;
    union 
    {
        uint8_t v4[4];
        uint8_t v6[16];
    } bytes;
}

你会这样使用它:

struct IpAddress address = // Something
if (address.isIPv6)
{
    doSomeV6ThingWith(address.bytes.v6);
}
else 
{
    doSomeV4ThingWith(address.bytes.v4);
}

从历史上看,unions 还用于将一种类型的位获取到另一种类型的对象中。这是因为,在联合中,成员都从相同的内存地址开始。如果我只是这样做:

float f = 3.0;
int i = f;

编译器将插入代码将浮点转换为整数,因此指数将丢失。然而,在

union 
{
    unsigned int i;
    float f;
} x;

x.f = 3.0;
int i = x.i;

i现在包含代表的确切位3.0 in a float。或者至少你希望如此。 C 标准中没有任何内容说明float and unsigned int必须是相同的大小。 C 标准中也没有强制要求特定的表示形式float(嗯,附件 F 说浮子符合 IEC 60559 ,但我不知道这是否算作标准的一部分)。所以上面的代码充其量是不可移植的。

获取a的指数float便携式方式是frexpf() https://linux.die.net/man/3/frexp函数定义在math.h

我如何操纵 f2i 函数来达到此目的?

让我们假设一个float以 32 位的 IEC 60559 格式存储,Wkipedia 认为与IEEE 754 https://en.wikipedia.org/wiki/Single-precision_floating-point_format。我们还假设整数以小端格式存储。

union 
{
    uint32_t i;
    float f;
} x;

x.f = someFloat;
uint32_t bits = x.i;

bits现在包含浮点数的位模式。单精度浮点数看起来像这样

SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM
^        ^                     ^
bit 31   bit 22                bit 0

Where S是符号位,E是一个指数位,M是尾数位。

所以有了你的int32_t你只需要做一些移位和掩蔽:

uint32_t exponentWithBias = (bits >> 23) & 0xff;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在c中获取浮点数的指数 的相关文章

  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • 在jquery中获取选定tr的td值

    下面是我的桌子 table tr class chargeTR td charge1 td td charge2 td tr table 下面是我的 jQuery 调用 chargeTR each function this line wo
  • 跨域ajax请求后保留cookie

    一个 JavaScript 应用程序运行在10 0 0 1尝试通过跨域 ajax 调用来验证其用户 该请求如下所示 function test again ajax type GET url http example com userinf
  • 简单框架:重复注释(不同的命名空间)

    我有一个 Rss 提要 我想使用简单框架在 Java 中解析它 我遇到了两个同名元素的问题 但其中一个元素分配了命名空间 下面是一个 xml 示例
  • ActionScript 3 分析器和内存分析工具

    我正在使用 Adob e Flash CS 4 想知道是否有可用的分析器或内存分析工具 动作脚本 3 我知道有适用于 Flex 的工具 但是有适用于 Flash CS 4 的工具吗 谢谢 我确信那里有一个程序 仍在寻找我自己 但我 大多数
  • 如何从 Angular2 和 ng-bootstrap 组件中的 NgbTabSet 访问“select”方法?

    使用 Angular 2 3 1 和 ng bootstrap 1 0 0 alpha 18 我正在尝试以编程方式根据组件中的 ID 而不是模板内的 ID 选择选项卡 目标是从 url 中提取参数并使用它来选择 ngOnInit 中的选项卡
  • 在 Javascript 中从本地数据保存文件

    场景如下 用户来到我的网站并打开一个带有一些 JavaScript 功能的网页 用户通过javascript编辑数据 用户单击保存按钮来保存数据 事情是 他们似乎不需要下载这些数据 因为它已经在本地计算机上的 JavaScript 中 是否
  • 用于检测 .NET CF 3.5 并安装它的 Windows Mobile Cab 设置

    我使用 NET CF 3 5 等目标框架和 professional 6 SDK 开发了 windows mobile 6 professional 应用程序 还创建了其 SmartDeviceCab 文件 当我将其安装在没有 CF 3 5
  • 如何控制.NET SoapFormatter中的命名空间?

    我正在编写一些需要向后兼容使用 SOAP 序列化某些对象的现有远程处理代码的代码 我的困难是我必须将一些对象移动到新程序集 因此远程处理被破坏 例如 我使用 NET SoapFormatter 序列化一个对象 如下所示 Person p n
  • vim 正则表达式用于替换引号内的空格

    我有以下格式的文本 ERR OUT OF MEM ERR OUT OF MEM ERR SOMETHING BAD ERR SOMETHING BAD 我想用下划线替换文本中引号内的所有空格 ERR OUT OF MEM ERR OUT O
  • MVVM 最佳实践:视图模型之间的通信

    我的简化程序结构如下所示 public class Manager public Item MyItem get set public void Recalculate public class Item public string Som
  • 每对观测值的马氏距离

    我正在尝试计算数据集的每个观测值之间的马哈拉诺比斯距离dat 其中每行是一个观察值 每列是一个变量 该距离定义为 我写了一个函数来做到这一点 但我觉得它很慢 在 R 中是否有更好的方法来计算它 生成一些数据来测试该功能 generateDa
  • 这个正则表达式不应该发生灾难性的回溯

    有人可以解释为什么 Java 的正则表达式引擎会在此正则表达式上进入灾难性的回溯模式吗 据我所知 每个交替都与其他每个交替相互排斥 s s Text p o de a car itaucard mastercard platinum SUS
  • 如何在Python 3.6中执行2个协程

    我无法让两个协程在我的 Python 3 6 程序中并行执行 这是一个例子 import asyncio time def main loop asyncio get event loop loop run until complete s
  • 查找C++静态初始化顺序问题

    我们遇到了一些问题静态初始化顺序惨败 http www parashift com c faq lite static init order html 并且我正在寻找方法来梳理大量代码以查找可能发生的情况 关于如何有效地做到这一点有什么建议
  • Cypher 查询 JSON 格式的结果

    在演员 电影演示图上 cypher 在单独的数组中返回列名称 MATCH n Person RETURN n name as Name n born as Born ORDER BY n born LIMIT 5 results colum
  • Mysql查询查找具有相同列值的字段之和

    我有一张这样的桌子 id invent id order 1 95948214 70 2 46018572 30 3 46018572 20 4 46018572 50 5 36025764 60 6 36025764 70 7 95948
  • Java音乐播放器:歌曲信息和播放[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 在Android中 我们可以使用媒体播放器在设备上播放歌曲 并使用光标来获取曲目信息 操作系统跟踪的信
  • 简单登录返回空白页

    我正在学习 PHP 并且制作了一个简单的登录脚本 但问题是它仅将我重定向到空白页面 如果用户凭据正确 它的意思是重定向到index php 但情况显然并非如此 还有验证 如果用户输入空白 则会返回错误 这似乎没有被执行 登录 php
  • 使用 rdmsr/rdpmc 提高分支预测精度

    我试图了解分支预测单元在 CPU 中如何工作 我用过papi还有linux的perf events但他们都没有给出准确的结果 对于我的情况 这是我的代码 void func int arr int sequence len for int
  • 在c中获取浮点数的指数

    抱歉 如果已经有人问过这个问题 并且我已经看到了提取浮点数指数的其他方法 但这就是给我的 unsigned f2i float f union unsigned i float f x x i 0 x f f return x i 我无法理