linux与windows相同,有没有办法确保浮点运算结果在linux和windows中都相同

在Windows上使用/ fp:strict告诉编译器生成严格遵循IEEE 754的代码,并在Linux上生成gcc -msse2 -mfpmath = sse以获得相同的行为.

您所看到的差异的原因已经在StackOverflow上进行了讨论,但最好的调查是David Monniaux的article.

我用gcc -msse2 -mpfmath = sse编译时得到的汇编指令如下.说明cvtsi2ssq,divss,mulss,addss是正确的使用指令,它们会产生一个程序,其中p_value包含一个点42d5d1ec.

.globl _main

.align 4, 0x90

_main: ## @main

.cfi_startproc

## BB#0:

pushq %rbp

Ltmp2:

.cfi_def_cfa_offset 16

Ltmp3:

.cfi_offset %rbp, -16

movq %rsp, %rbp

Ltmp4:

.cfi_def_cfa_register %rbp

subq $32, %rsp

movl $0, -4(%rbp)

movl $0, -8(%rbp)

LBB0_1: ## =>This Inner Loop Header: Depth=1

cmpl $100000, -8(%rbp) ## imm = 0x186A0

jge LBB0_4

## BB#2: ## in Loop: Header=BB0_1 Depth=1

movq _p_value@GOTPCREL(%rip), %rax

movabsq $100, %rcx

cvtsi2ssq %rcx, %xmm0

movss LCPI0_0(%rip), %xmm1

movabsq $10, %rcx

cvtsi2ssq %rcx, %xmm2

cvtsi2ss -8(%rbp), %xmm3

divss %xmm3, %xmm2

movss %xmm2, -12(%rbp)

cvtsi2ss -8(%rbp), %xmm2

mulss %xmm2, %xmm1

addss %xmm0, %xmm1

movss %xmm1, (%rax)

movl (%rax), %edx

movl %edx, -16(%rbp)

leaq L_.str(%rip), %rdi

movl -16(%rbp), %esi

movb $0, %al

callq _printf

movl %eax, -20(%rbp) ## 4-byte Spill

## BB#3: ## in Loop: Header=BB0_1 Depth=1

movl -8(%rbp), %eax

addl $1, %eax

movl %eax, -8(%rbp)

jmp LBB0_1

LBB0_4:

movl -4(%rbp), %eax

addq $32, %rsp

popq %rbp

ret

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值