我是靠谱客的博主 感动钢铁侠,最近开发中收集的这篇文章主要介绍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

最后

以上就是感动钢铁侠为你收集整理的linux与windows相同,有没有办法确保浮点运算结果在linux和windows中都相同的全部内容,希望文章能够帮你解决linux与windows相同,有没有办法确保浮点运算结果在linux和windows中都相同所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(65)

评论列表共有 0 条评论

立即
投稿
返回
顶部