肥宅钓鱼网
当前位置: 首页 钓鱼百科

vs如何打心形代码(VS2022和浮点整型转换)

时间:2023-07-07 作者: 小编 阅读量: 4 栏目名: 钓鱼百科

对于有符号整数,这与VS2017相同。默认情况下,VS2022恢复为VS2017后会处理这些转换。这也称为“向零舍入”。(返回的具体值取决于结果类型。如果原值为NaN,则结果将返回零。即使结果是错误的,也尽可能接近正确的结果,可能不太可能导致失败。ARM对其转换指令使用饱和的方式。此外,在x86上,从函数调用返回的浮点值的转换行为可以是任何一种方式。除了这些函数之外,还有快速转换函数,它们尽可能快地执行有效转换。

先快速总结下今天的内容:> 不再支持/QIfirst。> MSVC现在可以兼容标准C中的所有浮点整型转换。> 浮点转换为带符号的整型数未发生改变。> 在默认情况下,对于浮点整型转换,VS2022保持与VS2017及其更早版本的兼容性。> 对于VS2019中的浮点转换为无符号整型,有如下几点说明>> 当面向x64时,它通常会和VS2017兼容。>> 当面向x86时,它通常会和AVX-512兼容。>> 对于v16.7及更高版本,可以使用/fpcvt:BC编译开关以和VS2017保持兼容性。> 编译器内部函数(Intrinsic Functions)可以提供更多选项及更精细化的控制。

简介

你可能已经知道了,VS2019更改了英特尔架构 (IA) 的一些浮点到整型转换。当面向32位的IA(x86)架构是,大多数转换与英特尔 AVX-512 转换指令相匹配。 对于有符号整数,这与VS2017 相同。对于无符号整数,无效转换的结果可能不同,我会在后面进行解释。 对于 64 位 IA (x64),当选择 /arch:AVX512 时,会使用 AVX-512 指令,但其他方面与 VS2017 没有变化。很抱歉,我们没有宣布这一变化,直到 16.7 版本我们才提供向后兼容的选项。

默认情况下,VS2022恢复为VS2017后会处理这些转换。 它还保留了使用与 AVX-512 兼容的转换的选项。 这篇文章会告诉你更多相关信息,包括你可能想要使用的其他选项。

背景知识

标准C指定了对数据进行有效转换的工作方式,但无效转换可以做任何事情。有效的转换从截断浮点值开始,它丢弃任何小数部分,只留下整数值。这也称为“向零舍入”。如果截断的值可以用结果类型表示,则转换有效,并且结果必须是该值。

十多年来,MSVC 一直与此方式兼容,并且直到符号类型的无效转换才发生了变化。大多数浮点运算通过返回特殊的“非数字”(NaN) 值来指示无效运算,但转换为整数不允许该选项。任何结果值都可以来自有效的转换,并且无效转换没有单一的“正确”结果。

当然,这种完全随机的转换结果,是没有用的,所以通常使用两种不同的方法。英特尔架构 (IA) 使用离零最远的结果值代替 NaN,因此任何无效的转换都会返回此标记值。 (返回的具体值取决于结果类型。) 临界值易于测试,并且在测试和调试过程中经常会导致独特的行为。

另一种常见的方法称为饱和,其中任何太高而无法放入目标类型的浮点值,它都会给出可能的最高目标值,而任何太低而无法容纳的值,它都会给出可能的最低值。如果原值为 NaN,则结果将返回零。即使结果是错误的,也尽可能接近正确的结果,可能不太可能导致失败。 ARM 对其转换指令使用饱和的方式。

VS2017中的转换规则

自第一台 IBM PC 出现之前,英特尔架构就有将浮点类型转换为有符号整数类型的指令,但在 AVX-512 中首次引入了转换为无符号整数类型的指令。 在VS2017 之前,到无符号整数类型的转换基于到 long long 类型的转换。 转换为 unsigned 首先转换为 long long,然后截断为 32 位。 转换为 unsigned long long 时,对于 long long 来说太高的有效源值将作为特殊情况处理。 所有其他值都简单地转换为 long long 并重新转换。 这解决了缺少无符号转换指令的问题,但为无效转换返回的值并不是特别有用。

VS2019中的转换规则

对于 VS2019,我们打算使所有 FP 到整数的转换与相应的英特尔架构转换指令兼容。 这允许在选择 /arch:AVX512 时使用 VCVTTSD2USI 和 VCVTTSS2USI 而不会改变行为。 但是,这种变化比我们预期的要困难一些,并且一些测试用例还没有完成。 它仅在选择 /arch:AVX512 时在 x64 上启用。 在 x86 上,选择 /arch:IA32 或 /arch:SSE 时未启用它。 此外,在 x86 上,从函数调用返回的浮点值的转换行为可以是任何一种方式。 虽然这仍然与标准 C兼容,但这显然是不可取的,我们引入了 /fpcvt 选项以允许开发人员选择他们想要的行为。

编译开关/fpcvt

从VS2019 版本 v16.7 开始,/fpcvt 编译选项控制浮点到无符号整数转换的结果。 有两个选择:/fpcvt:BC 指定向后兼容的 VS2017 行为,和 /fpcvt:IA 指定新的 AVX-512 指令行为。 此选项适用于 x86 或 x64 目标,无论是否指定 /arch:AVX512 都适用。 在 VS2022 中,默认值已更改为与 /fpcvt:BC 相同,但 /fpcvt:IA 选项仍可用于 x86 和 x64。

用于转换的编译器内部函数

使用/fpcvt编译开关,有如下几个问题:> 它适用于所有已编译的转换,即使这不是最佳选择。> 它适用于可能已编写为预期其他行为的头文件和源代码模块。> /fpcvt 选项都不会生成饱和转换。 Saturation 提供与 Rust 和 WebAssembly 等语言的兼容性,以及针对 ARM 编译的代码。

VS2022 提供了内部函数来解决这些问题。 这些标记和饱和转换函数在 IA 上完全定义,因此行为不会因编译设置或上下文而改变。

除了这些函数之外,还有快速转换函数,它们尽可能快地执行有效转换。 与饱和转换和哨兵转换不同,它们没有完全定义,并且可能会根据目标平台、编译设置和上下文为无效转换生成不同的值或异常。 它们对于处理已经过范围检查的值或以永远不会导致无效转换的方式生成的值非常有用。具体请看下表:

/QIfirst不再支持

VS2022的v17.0版本仍然支持 x86 上已弃用的 /QIfist 选项,但我们将在更新中将其删除。 此选项允许浮点到 int 转换根据当前舍入模式进行舍入(通常是舍入到最近的舍入,与偶数相关),而不是像标准 C中指定的那样总是截断。 此选项支持在采用截断作为标准之前在 x86 上面编写的遗留代码。 它从未在其他目标平台上得到支持,并且在许多版本中都被标记为已弃用。 在转换为整数之前使用内部函数对浮点值进行舍入,因为这更清晰、更快且更易于移植。

总结

乖乖,想不到浮点转整型,还有这么多门道。原理小的就先跳过,还是走一步看一步吧。

最后

Microsoft Visual C团队的博客是我非常喜欢的博客之一,里面有很多关于Visual C的知识和最新开发进展。大浪淘沙,如果你对Visual C这门古老的技术还是那么感兴趣,则可以经常去他们那(或者我这)逛逛。本文来自:《Microsoft Visual Studio 2022 and Floating-point to Integer Conversions》

    推荐阅读
  • 公组词有哪些(公组词及解释)

    公组词有哪些公称造句:晶粒的平均截距和晶粒的弗里特直径及晶粒的公称直径是表示晶粒尺寸的三种方式,三者间存在着必然的联系。雷公造句:六个月后,服用雷公藤的患者中有65%的人症状至少有20%的好转,而服用硫氮磺胺吡啶的患者中只有33%的患者症状有所好转。

  • 女生呆萌的昵称(女生呆萌的昵称有哪些)

    下面更多详细答案一起来看看吧!女生呆萌的昵称陌路如初花祭凉兮旧颜残訫洋洋陌颜温瞳幼荷埋葬清欢哭瞎囡囡孤祭屿风久孤冷眸青橙

  • 当一个男生彻底喜欢你的表现(男生爱上一个人有3种表现)

    甚至偷偷地以女朋友的身份自居,到最后失望的概率会很大。当无法自拔的爱上了一个人,无论是在梦里还是在梦外,思念的都是同一个人。有很多情侣即便是要睡觉,可还是舍不得放下手机。爱一个人就是希望对方快乐。在爱的世界中是相互的,爱是动态。男生表达他的爱意,女生积极地回应,这样的爱情才会更长久,幸福指数也越高。在良性的互动中,感情逐渐升温,彼此在对方心目中的位置也最稳固。女生要分辨清楚,才不至于受伤。

  • vivo截图怎么截图(几种方法教你轻松搞定)

    vivo截图怎么截图?以下内容希望对你有帮助!若手机有超级截屏功能,可进入手机桌面上拉快捷栏--超级截屏,选择截屏方式进行截屏。三指平放上滑截图。进入设置--更多设置--悬浮球中,将「悬浮球」开启,然后在任意界面点击悬浮球“截屏”快捷工具完成截屏。唤醒Jovi语音助手后,说出“截屏”语音助手即会执行截屏操作。

  • 可行性报告怎么写好(可行性报告的格式写法)

    ----编者目录第1章项目总论6项目背景6项目名称6项目承办单位6项目主管部门6项目拟建地区、地点6承担可行性研究工作的单位和法人代表错误!产品产量及销售量调查错误!为了正确显示自动页码,一般这样的文挡至少要分为三个节,封面一个节,目录一个节,其余为一个或多个节,在每个节里可以独立进行页面设置和页码设置。自定义正文、各级标题的样式的方法:可查看帮助,在目录与索引框中录入“样式”,之后查看相关。

  • 少帅张作霖身份(为什么在少帅这部剧中)

    为什么在少帅这部剧中当听到“他妈拉个巴子”这句骂人的话,很多人想到了说话那个人素质真低,又或者暴起把说话那个人再骂一顿或者打一顿不过小编第一次看到这个词语还是在《少帅》这部电视剧当中这是张作霖的口头禅图片来源于网络因为这。

  • 炒什么菜补钙效果好(我经常给家里的小朋友做这个菜)

    西葫芦的营养成分很高,含有较多维生素C和葡萄糖等营养物质,如有蛋白质、脂肪、纤维素、胡萝卜素等,尤其是钙的含量极高。

  • 桂花如何晒干保持香味 桂花怎么晒干才香

    桂花没有香味还有用吗不建议再用。桂花中含有茶多酚,而这种物质具有兴奋神经,提神醒脑的作用,因此如果在睡觉之前喝的话,很有可能会引起失眠的情况发生。但由于每个人的身体的状况不同,有些人可能对茶多酚一点都不敏感,那么在饮用后对睡眠也不会产生什么不良影响,因此是否会失眠也是完全因人而异。桂花可以直接食用吗不可以。

  • 读春联的顺序是什么(春联讲究什么读起来什么)

    读春联应该先读上联,再读下联,最后读中间的横批。分辨上下联主要看横批的书写,如果横批是从右向左书写,上联就应该贴在右边,反之上联则贴在左边。还能从句子的尾音判断上下联,在对联中上联以仄声收尾,下联以平声收尾。

  • 2022长春朝阳区发票抽奖活动加油发票可以参与吗?

    发票为正数有效发票,不含已作废、红冲发票。(四)参与抽奖发票开具时间段长春市朝阳区限上贸易企业在2022年6月18日至6月26日期间开具的符合上述规定发票。抽奖号码由印制在发票票面上的发票代码和发票号码构成,中奖发票采取随机选取方式,由公证部门进行现场公证。