5

Cuando puedo depurar mi software en VS C++ mediante la intensificación del código Noto que algunos cálculos flotador se muestran como un número con un punto de salida, es decir:¿El punto en el extremo de un flotador sugiere falta de precisión?

1232432. 

Una operación que conducen a este resultado es la siguiente:

float result = pow(10, a * 0.1f)/b 

donde a es un número negativo grande aproximadamente un -50 a -100 y b es lo más a menudo alrededor de 1. he leído algunos artículos sobre un problema con precisión cuando se trata de puntos flotantes. Mi pregunta es si el punto final es una forma Visual-Studio de decirme que la precisión es muy baja en este número, es decir, en el resultado de la variable. Si no, ¿qué significa?

Esto vino hoy al trabajo y recuerdo que había un problema para números más grandes, así que esto ocurría siempre (y con "esto" me refiero a ese punto final). Pero sí recuerdo que sucedió cuando había siete dígitos en el número. Aquí Wright que la precisión de los flotadores son siete dígitos:

C++ Float Division and Precision

Puede esto ser la cosa y Visual Studio me dice esto poniendo un punto en el final?

¡PIENSO QUE LO ENCONTRÉ! Dice "La mantisa se especifica como una secuencia de dígitos seguida de un punto". ¿Qué significa la mantisa? ¿Puede esto ser diferente en una PC y cuando se ejecuta el código en un DSP? Porque la cosa es que obtengo resultados diferentes y lo único que me parece extraño es esta cosa de la época, ya que no sé lo que significa.

http://msdn.microsoft.com/en-us/library/tfh6f0w2(v=vs.71).aspx

+1

FYI '1.' y' .1' son literales dobles válidos en C++ (al menos gcc) – Joe

+0

I consiguen que .1 es un float/double válido, pero ¿por qué no imprime el mismo rastreo? por cada carroza? Si un doble es cero, imprime 0.00000 pero nevery 0. solamente. Por qué es un punto final solo un par de veces, debe ser algo especial que ocurre para algunos números grandes. –

+0

@ThomasJohansson: Tendrás que hablar de eso con el equipo VS, supongo. El punto es que no tiene absolutamente nada que ver con la precisión de un flotador. Aquí, debes saber [este material] (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html). –

Respuesta

3

Si se refiere a la convención "sig higos", donde "4.0" significa 4 y plusmn; 0.1 y "4,00" significa 4 y plusmn; 0.01, entonces no hay , no existe tal concepto en float o double. Los números siempre * se almacenan con 24 o 53 bits significativos (7.22 o 15.95 dígitos decimales) independientemente de cuántos sean realmente "significativos".

El punto final es solo un punto decimal sin ningún dígito después (que es un literal C legal). Es bien significa que

  • El valor es 1232432.0 y trimed la innecesaria cero de salida, OR
  • Todo está siendo redondeado a 7 dígitos significativos (en cuyo caso el valor real también podría ser 1232431.5, 1.232.431,625, 1.232.431,75, 1232431.875, 1232432.125, 1.232.432,25, 1.232.432,375, o 1.232.432,5.)

El verdadera pregunta es, ¿Por qué utiliza float? double es el tipo de punto flotante "normal" en C (++) y float una optimización de ahorro de memoria.

* Pedantes serán rápido en señalar denormals, valores intermedios x87 80 bits, etc.

+0

Gracias! ¡Ya encontré el problema original y logré resolverlo, pero esta es una buena explicación! –

+0

Tnx! Vi este punto final aquí, que si no me equivoco, se utiliza como mecanismo de conversión int: int i = 10. * sqrt (n) –

3

La precisión no es variable, que es simplemente la forma VS se formatea para su visualización. La precisión (o falta de) siempre es constante para un número de coma flotante dado.

+6

Aunque un punto final puede ser una pista de que el número es un número en coma flotante en lugar de un número entero. – Brian

+0

@Brian: Creo que es por eso que está allí, simplemente sucede que tiene todos los 0 después del decimal. –

+0

Porque no imprime un punto al final de cualquier coma flotante y no lo imprime para el mismo punto flotante cada vez, por lo que debe ser algo especial que ocurre en algún momento. Para un cálculo traté de calcular el valor con la calculadora de Windows y fue diferente ... –

1

El MSDN page que ha vinculado habla de la sintaxis de un literal de coma flotante en el código fuente. No define cómo se mostrará el número con la herramienta que esté usando. Si imprime un número de coma flotante con printf o std:cout << ..., el estándar de idioma especifica cómo se imprimirá.

Si imprime en el depurador (que parece ser lo que está haciendo), se formateará de la manera que los desarrolladores del depurador decidieron.

Hay un número de diferentes formas en que un número de coma flotante dada se puede mostrar: 1.0, 1., 10.0E-001 y .1e+1 todos significan exactamente lo mismo. Un . posterior generalmente no dice nada acerca de la precisión. Mi suposición es que los desarrolladores del depurador simplemente usaron 1232432. en lugar de 1232432.0 para ahorrar espacio.

Si está viendo el . posterior para algunos valores, y un número decimal sin . en absoluto para otros, eso suena como un fallo extraño (posiblemente un error) en el depurador.

Si se está preguntando lo que la precisión real es, por IEEE de 32 bits float (el formato más ordenadores utilizan en estos días), los próximos números representables antes y después de 1232432.0 son 1232431.875 y 1232432.125.(Usted obtendrá una precisión mucho mejor usando double en lugar de float.)

Cuestiones relacionadas