浮点转换和性能

2024-05-02

我知道在浮点数和整数之间进行转换时可能会出现错误,但是性能如何(请忽略准确性问题)?

一般来说,如果我对不同算术类型的操作数(即不同的浮点类型(例如,float and double)和浮点/整数类型组合(例如float and int)?是否存在经验规则,例如保持所有操作数相同类型?

P.S.:我问这个问题是因为我正在编写一个表达式模板库,并且想知道是否允许对包含不同算术类型的值的向量进行二进制运算。


我怀疑这个问题的答案会因目标架构而异,因为转换可以(但可能不会)在硬件中发生。例如,考虑以下代码,它会导致 int 和 float 之间的一些相互转换:

int main (int argc, char** argv)
{
    int precoarced = 35;
    // precoarced gets forced to float
    float result = 0.5 + precoarced;

    // and now we force it back to int
    return (int)result;

    // I wonder what the disassembly looks like in different environments?
}

当我尝试使用 g++(我在 Ubuntu,x86)上使用默认设置编译它,并使用 gdb 进行反汇编时:

   0x00000000004004b4 <+0>: push   %rbp
   0x00000000004004b5 <+1>: mov    %rsp,%rbp
   0x00000000004004b8 <+4>: mov    %edi,-0x14(%rbp)
   0x00000000004004bb <+7>: mov    %rsi,-0x20(%rbp)
   0x00000000004004bf <+11>:    movl   $0x23,-0x8(%rbp)
   0x00000000004004c6 <+18>:    cvtsi2sdl -0x8(%rbp),%xmm0
   0x00000000004004cb <+23>:    movsd  0x10d(%rip),%xmm1        # 0x4005e0
   0x00000000004004d3 <+31>:    addsd  %xmm1,%xmm0
   0x00000000004004d7 <+35>:    unpcklpd %xmm0,%xmm0
   0x00000000004004db <+39>:    cvtpd2ps %xmm0,%xmm0
   0x00000000004004df <+43>:    movss  %xmm0,-0x4(%rbp)
   0x00000000004004e4 <+48>:    movss  -0x4(%rbp),%xmm0
   0x00000000004004e9 <+53>:    cvttss2si %xmm0,%eax
   0x00000000004004ed <+57>:    pop    %rbp
   0x00000000004004ee <+58>:    retq   

请注意带有 cvt 前缀的助记符的说明。这些是转换指令。因此,在这种情况下,转换是在硬件中通过少数指令进行的。因此,根据这些指令花费的周期数,它可能相当快。但同样,不同的架构(或不同的编译器)可能会改变情况。

编辑:有趣的是,由于我不小心指定了 0.5 而不是 0.5f,因此存在额外的转换。这就是 cvtpd2ps 操作在那里的原因。

编辑:x86 已经支持 FP 很长时间了(从 80 年代开始),因此针对 x86 的 C++ 编译器通常会利用硬件(除非编译器严重落后于时代)。感谢 Hot Licks 指出了这一点。

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

浮点转换和性能 的相关文章

随机推荐

  • 如何在使用图像创建视频时添加图像变化动画

    我有一组图像 我想通过按顺序播放这些图像来创建视频 我想在图像发生变化时添加不同类型的动画 建议我一些方法或任何解决方案来通过 Cocoa 框架在 Objective C 中实现此功能 这是制作图像视频的工作代码 但请建议我们在制作视频时如
  • Visual Studio 中的监视窗口

    有没有一种方法可以指定在监视窗口中查看对象的哪些成员 而无需扩展具有所有属性的树 例如 p new Point 10 10 将显示在 Watch 的 Value 列中 X 10 Y 10 对于我自己的课程 它总是显示 MyNamespace
  • 将文件从远程服务器复制到谷歌云存储桶

    如何将文件从远程服务器复制到 Google 存储桶 例如 gcloud compute scp username server path to file gs my bucket 这个方法会报错 All sources must be lo
  • 使用 Swift PDF417 解码并生成相同的条形码

    我有以下 PDF417 条形码示例 可以使用在线工具进行解码 例如zxing https zxing org w decode jspx 结果如下 5wwwwwxwww0app5p3pewi0edpeapifxe0ixiwwdfxxi0xf
  • 从 UIImageView 获取上下文

    我可以获取上下文吗 CGContextRef 来自存在UIImageView 详细信息 我有一个指向 xib 文件的控制器链接 在IB中我添加了一个UIImageView并参考它 IBOutlet UIImageView imageView
  • 带 if 语句的可向量化 FIND 函数 MATLAB

    我有一个矩阵u 我想遍历所有行和所有列并执行以下操作 如果元素非零 我返回行索引的值 如果元素为零 则查找该元素之后的下一个非零元素的行索引 我可以使用两个带有 find 函数的 for 循环轻松完成此操作 但我需要多次执行此操作 不是因为
  • 从 createProcess 外部获取的句柄读取

    我正在尝试创建一个进程 并通过我在外部提供的句柄与其进行通信createProcess功能 stdOutH lt openFile logDir gt stdout log ReadWriteMode hSetBuffering stdOu
  • DELETE 语句与 ASP.NET 动态数据中的 REFERENCE 约束冲突

    我有两个表 Application User 和 Application User Access Application User Access 表与 Application User 表具有外键约束 当我删除 Application Us
  • 如何更改图片框(winform)的边框颜色?

    我想根据不同的事件设置图片框周围的边框颜色 样式 是否有属性或功能可以帮助我实现该目标 我一直用的是这个 要更改边框颜色 请从PaintPicturebox 控件的事件处理程序 private void pictureBox1 Paint
  • 使用 global-method-security,访问被拒绝错误将作为 HTTP 500 错误返回

    我尝试使用 Spring Security Annotations 来确保安全 而不是在 XML 中定义规则 它似乎有效 但是当我遇到访问被拒绝错误时 我收到返回的 HTTP 状态代码 500 我在 tomcat 日志文件中没有看到任何异常
  • HttpURLConnection 发送图像、音频和视频文件,参数可以是(String 或 Json String)Android

    我正在分享solution发送一个image audio or a video带有参数的文件使用HttpURL连接 参数可以是 纯字符串或 JSON Android 客户端到 PHP 后端 设想 必须上传媒体文件 带参数的音频 视频和图像
  • 使用 keras.utils.Sequence 多处理和数据库 - 何时连接?

    我正在使用 Keras 和 Tensorflow 后端训练神经网络 数据集不适合 RAM 因此 我将其存储在 Mongo 数据库中并使用子类检索批次keras utils Sequence 一切正常 如果我跑的话model fit gene
  • 安卓卸载通知

    当用户卸载应用程序时有什么方法可以发送通知 如果用户卸载该应用程序 应用程序所有者应该收到以下用户已卸载该应用程序的通知 是否可以 应用程序本身不可能 除非有来自同一作者的其他应用程序可以检查 但我认为有一个可用但复杂的解决方法 应用程序可
  • 如何在 Microsoft bot 框架中仅使用图像的 base64 编码字符串显示图像?

    我尝试了下面的代码 这是我在模拟器中得到的输出 message Attachments Add new Attachment ContentUrl data image jpeg base64 xxxx 数据 uri 图像似乎有最大大小 但
  • Postgresql - 确定从级联删除中删除哪些记录

    我继承了一个相当大的 postgresql 数据库 我们有一个每月运行的作业 用于备份现有数据库并使用我们收到的更新的供应商数据创建一个新数据库 目前有一个小问题 在不深入了解表设置 数据建模内容等细节的情况下 我相信它可以通过简单的删除查
  • 将 char 数组转换为 hex 数组 (C++)

    我的问题是将字符数组转换为十六进制数字数组 我需要从字符数组中取出 2 个字符并将它们转换为一个十六进制数字 这是我的输入 unsigned char text 1024 06fb7405eba8d9e94fb1f28f0dd21fdec5
  • Rails 6 + Capistrano - 没有这样的 puma.sock 文件

    拜托 我有一个大问题10多个小时了 每当我使用 Capistrano 和 Puma 在 Rails 中运行应用程序部署并重新启动 nginx 时 当我尝试访问我的 Web 时 我会看到此错误 在此输入图像描述 https i stack i
  • php artisan migrate 命令错误:找不到驱动程序

    我的操作系统是windows Illuminate Database QueryException 找不到驱动程序 SQL 从 information schema tables 中选择 其中 table schema blog 且 tab
  • .net Framework 4 中的 nameof 表达式

    Visual Studio 2015 和 c 6 中引入了 nameof 表达式 nameof C 和 Visual Basic 参考 https msdn microsoft com en us library dn986596 28v
  • 浮点转换和性能

    我知道在浮点数和整数之间进行转换时可能会出现错误 但是性能如何 请忽略准确性问题 一般来说 如果我对不同算术类型的操作数 即不同的浮点类型 例如 float and double 和浮点 整数类型组合 例如float and int 是否存