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

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

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

对于有符号整数,这与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》

    推荐阅读
  • 复方丹参滴丸长期吃有什么副作用(复方丹参滴丸是否可以长期服用)

    通过查阅复丹参滴丸的说明书,其中规定的用法用量为口服或舌下含服,每次10丸,每日3次,4周为1个疗程,临床医生在通常情况下,不推荐长期的服用这个药物,如果一定需要长时间服用,一般最多3个疗程作用后需停用一段时间,因此,确切的说,复方丹参滴丸是不可以长期服用的。综上所述,复方丹参滴丸也不适用于所用冠心病患者,更不可长期服用。

  • 小年如何过出仪式感(小年怎样过出仪式感)

    小年如何过出仪式感扫尘土腊月二十四,扫房子:从二十四开始一直到除夕,我国民间把这段时间叫做“迎春日”,也叫“扫尘日”。扫尘为的是除旧迎新,拔除不祥。过了小年,离春节只剩下六、七天了,过年的准备工作显得更加热烈了。婚嫁过了小年,民间认为诸神上了天,百无禁忌。娶媳妇、聘闺女不用择日子,称为赶乱婚。直至年底,举行结婚典礼的特别多。

  • 什么茶能够排毒养颜(盘点可以排毒养颜的茶)

    什么茶能够排毒养颜玫瑰蜂蜜茶。材料:玫瑰花6朵、红茶1小包、蜂蜜一大勺、柠檬片一小片、白水550毫升。做法:将水倒入锅中煮沸后放入红茶包,冲泡约6分钟;将玫瑰分朵放入红茶液内拌一拌,继续用小火煮沸;倒入蜂蜜后关火并加入柠檬片即可。

  • 三年级语文比喻拟人练习题(中考语文现代文阅读理解第十五讲)

    一般来说出现“像”“好像”“好似”“犹如”等比喻词,这是明喻。如果说比喻词“像”换成了“是、成了、变成了”等词,这就是暗喻。比如“春风像个慈祥的妈妈。”,很多人不知道这是比喻还是拟人,要说是比喻吧,里面还有“春风、妈妈”又像是拟人。出现了比喻词“像”,本体是春风,比喻词“像”,喻体“母亲的手”,所以是比喻句。“春风温柔地抚摸着我。”

  • 比shoppingmall更好的商场模式(这些新mall真敢开)

    这些新mall真敢开2022已过的半年间,疫情反复冲击一线、新一线城市,实体零售商业难上加难逆行登场的新mall,虽数量环比同比均有下降,但总数仍超100个在这些新场子里,以往扮演着“锦上添花”角色的业态创新,转变为必备。

  • 湖北有什么好吃的菜苔(舌尖上的武汉洪山菜苔)

    洪山菜苔拥有中国地理标志保护产品。洪山菜薹炒腊肉是一道美味佳肴,也是每年春节招待客人必备菜。孙权便命当地官员每年将洪山菜薹运至建业,直到吴国太过世。唐太宗李世民当即下诏,拨皇银万两,命尉迟敬德立即建塔。由此可见,宝通寺的钟声对洪山菜苔的奇妙生长功不可没。洪山菜苔的丰富营养及口感都是普通菜苔望尘莫及的。“竹兰梅菊经霜脆,不及菜苔雪后娇。米酒汤圆宵夜好,鳊鱼肥美菜苔香。”

  • 杜甫字什么(杜甫简介)

    杜甫,字子美,自号少陵野老,唐代伟大的现实主义诗人,与李白合称“李杜”。出生于河南巩县,原籍湖北襄阳。为了与另两位诗人李商隐与杜牧即“小李杜”区别,杜甫与李白又合称“大李杜”,杜甫也常被称为“老杜”。官场不得志,亲眼目睹了唐朝上层社会的奢靡与社会危机。虽然杜甫是个现实主义诗人,但他也有狂放不羁的一面,从其名作《饮中八仙歌》不难看出杜甫的豪气干云。

  • 初中化学置换反应和化学反应区别(置换反应化学式总结)

    金属单质酸---盐氢气1、锌和稀硫酸反应:ZnH2SO4===ZnSO4H2↑2、镁和稀硫酸反应:MgH2SO4===MgSO4H2↑3、铝和稀硫酸反应:2Al3H2SO4===Al233H2↑4、锌和稀盐酸反应:Zn2HCl===ZnCl2H2↑5、镁和稀盐酸反应:Mg2HCl===MgCl2H2↑6、铝和稀盐酸反应:2Al6HCl===2AlCl33H2↑1-6的现象:有气泡产生。

  • 飞机上可以带酒精湿巾吗(酒精消毒湿巾能带上飞机吗)

    我们一起去了解并探讨一下这个问题吧!根据我国相关的航空规定,一般不允许旅客随身携带酒精上飞机,因酒精属于一种易燃易爆品,很容易发生安全隐患,不利于旅客以及他人的人身安全,而酒精消毒湿巾中含有一定量的酒精,不可以携带上飞机。

  • 比较有意境的名字微信头像(用你的名字作微信头像)

    大家好,我是颖子。我知道你为什么流泪,那每一滴眼泪都是你的生命。如同跳动的脉搏一般。没有丝毫的停歇。从你注定成为宇宙的神之后,你就没有停止流泪。本期主题:用你的名字制作微信头像,3D简约精致励志名字签名头像,人生靠自己。喜欢本期头像可在文章最后找到我,定制设计哦!