Pergunta

A minha aplicação está a gerar diferentes valores de ponto flutuante quando eu compilá-lo no modo de versão e no modo de depuração. A única razão que eu descobri é que eu salvar um log de rastreamento binário e um do compilação de lançamento é sempre tão ligeiramente fora da compilação de depuração, parece que o fundo dois bits dos valores float de 32 bits são diferentes cerca de 1/2 dos casos.

Você consideraria esta "diferença" é um bug ou seria esperado este tipo de diferença. Será que isso é um erro de compilação ou um bug biblioteca interna.

Por exemplo:

LEFTPOS and SPACING are defined floating point values.
float def_x;
int xpos;

def_x = LEFTPOS + (xpos * (SPACING / 2));

A questão é em relação ao compilador X360.

Foi útil?

Solução

Modo de disparo pode ter um conjunto estratégia FP diferente. Existem diferentes modos de aritmética de ponto flutuante, dependendo do nível de otimização que você gostaria. MSVC, por exemplo, tem rigorosas, rápidas e modos precisos.

Outras dicas

Eu sei que no PC, flutuantes registradores de ponto são 80 bits de largura. Portanto, se um cálculo é feito inteiramente dentro do FPU, você recebe o benefício de 80 bits de precisão. Por outro lado, se um resultado intermediário é movido para fora em um registo normal e volta, ele fica truncado para 32 bits, o que dá resultados diferentes.

Agora, considere que uma compilação de lançamento terá otimizações que mantêm os resultados intermediários nos registos FPU, enquanto que uma compilação de depuração provavelmente irá copiar ingenuamente resultados intermediários para trás e para a frente entre a memória e registradores -. E lá você tem a sua diferença no comportamento

Eu não sei se isso acontece em X360 muito ou não.

Eu ajudei um colega de trabalho encontrar uma opção de compilador que era diferente na depuração liberação vs. construções que estava causando suas diferenças.

Dê uma olhada / fp (Especifique de Ponto Flutuante comportamento) .

Não é um bug. Qualquer uperation ponto flutuante tem uma certa imprecisão. No modo de versão, otimização irá alterar a ordem das operações e você vai obter um resultado ligeiramente diferente. A diferença deve ser pequeno, no entanto. Se é grande você pode ter outros problemas.

Além dos modos diferentes outros de ponto flutuante têm apontado, SSE ou otimizações vetor similiar pode ser ligado para o lançamento. Convertendo aritmética de ponto flutuante de registos padrão para os registos vector pode ter um efeito sobre os bits mais baixos de seus resultados, como os registos vector será geralmente mais estreita (menos bits) do que o padrão registos de ponto flutuante.

Não é um bug. Este tipo de diferença é de se esperar.

Por exemplo, algumas plataformas têm registros flutuador que usam mais bits que são armazenados na memória, mantendo assim um valor no registo pode produzir um resultado ligeiramente diferente em comparação com o armazenamento de memória e re-carregamento da memória.

Esta discrepância pode muito bem ser causada pela otimização do compilador, o que geralmente é feito no modo de autorização, mas não no modo de depuração. Por exemplo, o compilador pode reordenar algumas das operações para acelerar a execução, o que pode concebivelmente causar uma ligeira diferença no resultado de ponto flutuante.

Então, eu diria que provavelmente não é um bug. Se você está realmente preocupado com isso, tente ligar otimização no modo de depuração.

Como outros mencionados, flutuante registradores de ponto têm maior precisão do que carros alegóricos, de modo a precisão do resultado final depende da alocação de registo.

Se você precisar de resultados consistentes, você pode fazer as variáveis ??volátil, o que irá resultar em resultados mais lentos, menos precisos, mas consistentes.

Se você definir um parâmetro de compilador que permitiu que o compilador para operações de reabastecimento de ponto flutuante, - por exemplo, / Fp:. Rápido - então, obviamente, não é um bug

Se você não definir qualquer switch, então é um bug - a padrões C ++ C e não permitir que os compiladores para operações de reordenamento sem a sua permissão.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top