Compartir a través de


Este artículo proviene de un motor de traducción automática.

Numérica

Pruebas para las funciones matemáticas en Microsoft Cloud Numerics

Stuart Brorson
Alan Edelman
Ben Moskowitz

 

Supongamos que necesita realizar un cálculo matemático. Por ejemplo, supongamos que necesita saber el seno del 34 °. ¿A qué te dedicas? Probablemente usted recurrir a una calculadora, computadora o algún otro dispositivo inteligente. En el dispositivo, escribe en "sin(34)" y obtendrá una respuesta, a menudo con 16 dígitos decimales de precisión. Pero, ¿cómo sabes que tu respuesta es correcta?

Estamos tan acostumbrados a obtener respuestas matemáticas de nuestros artilugios electrónicos que nadie piensa en si las respuestas son correctas! Casi todo el mundo lo da por sentado que nuestras máquinas nos dan las respuestas correctas. Sin embargo, para un pequeño grupo de ingenieros de calidad de software, corrección no puede darse por sentado; el trabajo es todo acerca de cómo obtener la respuesta correcta. Este artículo explica cómo se prueban las funciones matemáticas en la nueva biblioteca de matemáticas de Microsoft nube Numerics.

Cálculos más científicas y de ingeniería utilizan aritmética de punto flotante. El IEEE había estandarizado el funcionamiento básico de matemáticas de punto flotante en 1985. Una característica clave de la norma es que no reconoce que todos los números pueden representarse en un equipo. Mientras que el conjunto de números reales es infinita e incontables, el conjunto de números de punto flotante IEEE es necesariamente finito y contable debido a que la representación numérica de números de punto flotante utiliza un número fijo de bits. La construcción de números de punto flotante IEEE implica que también son números racionales, tan comúnmente usados tales como π no expresa exactamente y operaciones con ellos, tales como sin(x), no son exactos, tampoco.

Además, a diferencia de números enteros, el espacio entre los números de punto flotante IEEE es localmente uniforme, pero aumenta logarítmicamente con la magnitud del número propio. Este aspecto logarítmica está representada en figura 1, que muestra esquemáticamente las ubicaciones de trozos uniformes de números de punto flotante IEEE en la línea de número real. En la figura, válidos trozos de números de punto flotante (incorporados en la recta real) se indican mediante líneas verticales. Tenga en cuenta que la distancia entre los números de punto flotante aumenta logarítmicamente como la magnitud de x aumenta. La distancia entre dos números de punto flotante adyacentes a menudo se denomina unidad de menos precisión o unidad en último lugar (ULP) y se proporciona como una función integrada llamada eps(x) en muchos programas de matemáticas comunes. Una consecuencia de la variación en el espaciado es que un pequeño número cerca de 0 no tiene efecto cuando se añade a un número relativamente grande como 1.

The Floating-Point Number Grid Depicted Schematically
Figura 1 la cuadrícula de número de punto flotante representada esquemáticamente

Además de codificar formatos de números de punto flotante, el estándar IEEE proporciona orientación estricta sobre cómo precisa debe ser la rentabilidad de las operaciones matemáticas fundamentales. Por ejemplo, el estándar de IEEE que especifica los beneficios de las cuatro operaciones aritméticas (+, -, * y /) debe ser "mejor redondeado," es decir que debe ser la respuesta volvió más cercanos para el resultado "matemáticamente correcto". Aunque este requisito originalmente fue recibida con cierta resistencia, devolviendo el resultado best-rounded ahora tiene lugar en hardware, mostrando cómo común se ha vuelto. Más interesante, la especificación de punto flotante IEEE también requiere que la función raíz cuadrada devuelva el resultado best-rounded. Esto es interesante porque abre la puerta a dos preguntas: "Exactamente cómo puede una función irracional calcularse utilizando la representación de punto flotante IEEE?" y "Cómo debe probar la exactitud de una implementación de función?"

Las funciones precisas de computación

¿Qué factores van a determinar la exactitud de un cálculo? La realidad es que debemos esperar encontrar inexactitudes, como redondeo puede aparecer en cualquier paso en un algoritmo. Estos errores podrían compuesto, aunque a veces también puede cancelar. En la práctica, un diseñador de algoritmo debe aprender a vivir con y contener la inexactitud inherente de cálculos numéricos.

Puede separar los factores que contribuyen al error de cálculo en dos categorías:

  1. Factores relacionados con el algoritmo utilizado para realizar el cálculo. En particular, esto significa la estabilidad del algoritmo de sí mismo y su sensibilidad al redondeo errores. Un algoritmo de pobre e inestable tienden a devolver resultados menos exactos, mientras que un algoritmo estable, bueno devolverá resultados más precisos.
  2. La naturaleza intrínseca de la propia función y el dominio de sus entradas. Hay un límite teórico a la precisión alcanzable de cualquier implementación de función cuando computación utiliza un número finito (en lugar de un infinito) de bits. La razón es que el redondeo actúa como una fuente de error en el cálculo, y el comportamiento de la propia función determina si este error es amplificado o atenúa a medida que avanza el cálculo de las entradas a las salidas. Por ejemplo, calcular los valores de una función cerca de una singularidad, un cero o una oscilación rápida podría ser menos precisa en aquellos puntos que una función que varía lentamente en el mismo dominio de entrada de computación. Al hablar de esta precisión alcanzable intrínseca, hablamos de cómo es "bien condicionada" de la función.

Por consiguiente, comprobar la precisión de una implementación de la función consiste en verificar que el algoritmo devuelve resultados tan exacto como teóricamente posible. Los límites de posibilidad teórica se establecen por el condicionamiento de la función en cada una de sus entradas. Dicho de otra manera, utilizando números de punto flotante para calcular un resultado presenta dos posibles fuentes de error: Errores que podemos evitar mediante el uso de buena, estable algoritmos (factor 1) y errores que son más difíciles de evitar, ya que están relacionados con el comportamiento de la función en sus entradas (factor 2).

En análisis numérico, el concepto de condicionamiento es cuantificado por los llamados "números de condición", que mide la sensibilidad de una función a las variaciones en sus entradas. Dependiendo de la naturaleza exacta de la función bajo consideración (por ejemplo, el número de entradas, escalares versus matriz y así sucesivamente), hay una serie de expresiones complicadas para el número de condición. El caso más simple es una función diferenciable de una variable, tales como 1 / x, x 2, sin(x) o cualquiera de las otras funciones que probablemente encontrado en álgebra de la escuela secundaria. En este simple caso el número de condición de la función f está dada por:

Equation 1
Ecuación 1

Nos referiremos a esto más tarde como la ecuación 1. Como siempre, la notación f'(x) significa la derivada de la función f (x). Un número grande de condición (Kf >> 1) indica alta sensibilidad a las perturbaciones relativas, mientras que un pequeño número de condición (Kf < = 1) indica que la función es relativamente insensible a las perturbaciones. Intuitivamente, se puede ver que si una función tiene una singularidad — es decir, la función se funde, tales como 1 / x cerca de x = 0, derivado del captura de este efecto y devolver un número de gran condición.

Por ejemplo, considérese la función f (x) = 1/(1-x). Esta función obviamente sopla hacia arriba (es decir, se vuelve infinito) en x = 1. La derivada es f'(x) = 1 /(1-x) 2. Enchufar esto en la ecuación 1 y eliminando términos da el número de condición para esta función:

El número de condición Kf*(x)* tiende a infinito alrededor de x = 1, lo que significa que cálculos relacionados con esta función será sensibles a las perturbaciones como error de redondeo cuando x es cercano a 1. Porque f (x) sopla para → x 1, se espera que este comportamiento. Además, el número de condición Kf (x) va a 0 cuando x está cerca de 0. Esto indica que los cálculos utilizando esta función será insensibles a las perturbaciones cuando x → 0. Esto tiene sentido intuitivo porque f (x) tiende a un valor constante de 1, cuando x es mucho menor que 1.

Exactitud de la función prueba

Entonces ¿una prueba práctica de una función matemática se parece? Supongamos que queremos probar nuestra implementación de la función escalar y = f (x), donde x es la entrada y y es el valor devuelto de la salida. Dado un valor de entrada flotante x, prueba requiere tres elementos:

  1. El valor calculado por la función bajo prueba, ycomputada = fcomputada*(x)*.
  2. El resultado de "verdadero matemáticamente". Asumir que teníamos un oráculo que podría decirnos la respuesta matemáticamente correcta. Entonces todo ese valor a la más cercana de valor de punto flotante (por lo que se puede representar en una computadora). Este valor llamada ytrue = ftrue*(x)*.
  3. Una prueba de tolerancia. Para algunas funciones, esta tolerancia puede ser 0, lo que significa que ycomputed es exactamente lo mismo que el valor verdadero matemáticamente, ytrue. Por ejemplo, la especificación de punto flotante establece que la función sqrt() devuelve el valor de punto flotante que se encuentra más cercano a la respuesta exacta (es decir, best-rounded). En el caso general, sin embargo, no podemos esperar el retorno de todas las funciones que las aproximaciones best-rounded a sus valores exactos. Por lo tanto, la prueba de tolerancia debe incorporar información sobre cuánto error está permitido en el retorno de f (x). Nota que la tolerancia puede depender de los detalles de la función f (x), así como el valor exacto de la entrada, x.

Con estos ingredientes, la precisión de nuestra implementación de función se considera aceptable (es decir, pasa de nuestra prueba) si

| ycomputed* - ytrue | < Tol (f; x),*

donde la tolerancia depende tanto del valor de la entrada x y el comportamiento de la función propia.

En palabras, esta ecuación dice que la función pasa la prueba, si el valor devuelto difiere del valor "verdadero" por una cuantía inferior a la tolerancia de prueba (el error permitido). Tenga en cuenta que | ycomputed* - y*true | es el error absoluto de la función calculada.

En este formalismo, una prueba de función se realiza mediante la creación de un gran número de valores de entrada situada en el dominio de entrada de la función, ejecutando estos valores a través de la función bajo prueba y comparar la función salidas ycalculada respecto a los valores (matemáticamente true) best-rounded, yverdadero. Los valores de las entradas deben elegirse para cubrir todas las partes pertinentes del dominio de entrada válido de la función.

En este punto, el probador tiene dos preguntas por responder: ¿Qué es el "verdadero" resultado de una función? y ¿qué es una tolerancia razonable?

Para responder la primera pregunta, lo más sencillo es utilizar un paquete de matemáticas "precisión infinita" para crear los pares de entrada y salida utilizados para las pruebas. Este paquete no utiliza números de coma flotante de 32 bits o de 64 bits para calcular un valor. Por el contrario, utiliza una representación numérica — o mejor aún, una representación simbólica, un número que puede llevar la capacidad de calcular un número arbitrariamente grande de dígitos mediante el cálculo a expensas de la velocidad computacional. Varios paquetes de matemáticas disponibles comercialmente aplicación matemáticas de precisión infinita. También, muchas bibliotecas de matemáticas de precisión infinita pueden enchufarse en lenguajes comunes. La habilidad de usar matemáticas de precisión infinita a velocidades modernos es una innovación reciente, haciendo este tipo de prueba conveniente. Cualquiera de estos recursos es suficiente para crear pares llamados "valor oro" útil para probar la aplicación de punto flotante de una función.

Poner juntos — obtener la prueba de tolerancia

Una vez tengamos valores oro, debemos responder la otra pregunta: ¿Qué es una tolerancia razonable de la prueba? La tolerancia de prueba correcta es el componente crítico de la prueba. Si la tolerancia es irrealmente pequeña, la función nunca pasará su prueba, incluso si se utiliza el mejor algoritmo para calcularlo. Por otro lado, si la prueba de tolerancia es demasiado grande, significa que el error permitido es más grande que tiene que ser, y la función pasará la prueba, incluso si el algoritmo es defectuoso.

El número de condiciones definido anteriormente es la clave para determinar el error aceptable permitido en las pruebas de la función. La expresión para el número de condición puede ordenarse para leer:

Equation 2
Ecuación 2

Nos referiremos a esto más tarde como la ecuación 2. Si identificamos ∆x como la distancia entre un número de punto flotante y la siguiente, esta expresión nos dice cuánto la salida de f (x) saltará como pasamos de un número de punto flotante x a su vecino, x + ∆x. Tradicionalmente, el campo de los valores numéricos de equipo toma ∆x la función eps(x), el espacio entre los dos números de punto flotante adyacentes. Tenga en cuenta que debido a que el espaciado de cuadrícula es no constante (véase figura 1), eps(x) es una función de x. (Como se señaló anteriormente, la distancia entre un número de punto flotante y su vecino más cercano también está relacionada con un ULP — la magnitud representada por el bit menos significativo.)

A continuación, exigimos que el error de salida en nuestra prueba, ycomputada -ycierto, ser menos algunos múltiplo de este salto. Es decir, le pedimos que, donde C es una constante:

Intuitivamente, esta expresión captura la siguiente idea: Si x hace un paso en la cuadrícula de punto flotante, el cambio en la salida no debe ser mayor que la ecuación 2. Una función precisa f (x) va a cambiar su salida sólo el importe derivado de los números de condición y no más. Por lo tanto, la salida las perturbaciones que se producen durante el cálculo de f (x) debe ser menor que el cambio causado por tomar un paso en la parrilla de punto flotante. La constante C es un "factor de chapuza". Obviamente, como C aumenta la tolerancia permitida aumenta con ella. Por lo tanto podemos interpretar esta constante como el error permitido funcional sobre el mínimo teórico. En la prueba real, C toma valores enteros entre 1 y 10, que interpretamos como el error permitido, expresado en zanjarlas.

Finalmente, usando la definición de los números, podemos reordenar la ecuación de una forma que expone la prueba de tolerancia:

| ycomputada -ytrue | ≤ C | f'(x) | eps(x) = tolerancia

Esta es nuestra prueba deseada — es la expresión que debe ser satisfechas por una aplicación precisa de la función f (x) para cualquier entrada x. En otras palabras, esto es la expresión que se utiliza para validar las funciones matemáticas escalares. Tenga en cuenta que esta expresión debe mantener cierto para todos los valores de entrada válidos x.

La pregunta final a resolverse es, "¿Cuál es el valor correcto de C a utilizar en las pruebas?" Porque interpretamos C como el número de errores ULP permitido, C es un número entero de orden 1. Nos C a partir de una inicial C valor (usualmente 10) y ejecutar la prueba. Si pasa la prueba, disminuir C 1 y ejecutar la prueba de nuevo. Repita este procedimiento para disminuir C valores hasta que falla la prueba. A continuación, elija el valor de C modificada que permite la prueba a pasar (pero mantenga siempre un ser humano en el bucle para garantizar la razonabilidad). El objetivo de este proceso es cerrar la puerta a pasar tanto como sea posible (mientras sigue permitiendo la función pasar la prueba) por lo que puede estar seguro que la función es probada rigurosamente como sea posible. Funciones de buen comportamiento típicamente requieren C valores entre 1 y 3, pero las funciones más complicadas pueden requerir mayor C valores para pasar. Encontramos que muy pocas implementaciones de función requieren C > 10 para pasar, y cuando nos encontramos con una función que requiere C > 10, a menudo señala una implementación óptima.

Desde la perspectiva de pruebas de software, una vez C está determinado para la prueba de la función (y los pases de prueba), sabemos que cualquier fallo en la prueba posterior significa que algo en función de la aplicación ha cambiado — probablemente para peor (por ejemplo, ha ocurrido una regresión). Por supuesto, trade-offs en el diseño de algoritmos pueden dictar que vale la pena darle cierta holgura en C si la regresión es pequeña (por ejemplo, una velocidad versus equilibrio de precisión). Asimismo, después de mejorar un algoritmo, merece la pena para ver si C puede apretarse aún más. En cualquier caso, un trabajo de pruebas de software se convierte en gestionar las tolerancias de pruebas como se desarrolla el resto del software.

Pruebas de valor oro y más allá

En la metodología de pruebas que hemos analizado hasta ahora, hemos utilizado precalculados pares de entrada/salida repartidos por todo el dominio de entrada de la función bajo prueba. Llamamos a este tipo de prueba valor oro, lo que significa que el oráculo de la prueba de precisión infinita proporciona oro pares de entrada/salida que se saben que son altamente precisas. Los pares pueden almacenarse en un archivo y leer en el programa de prueba cuando se ejecuta. Como un método de caja negra para probar la exactitud funcional, este enfoque funciona bastante bien. Sin embargo, otros tipos de pruebas de la función también proporcionan maneras importantes para validar el comportamiento de la función. Otras pruebas incluyen:

  • Valor especial de la prueba: Muchas funciones volver conocidas, exacta teórica valores para ciertos insumos, tales como cos(0) = > 1, sin(π) => 0 y gamma(1/2) = √π, por ejemplo. En una prueba de valor especial, insumos fijos conocidos son alimentados a la función bajo prueba y la devolución de la función se compara con el resultado conocido. Por supuesto, porque los números irracionales como π no se encuentran exactamente en la parrilla de punto flotante, la aproximación más cercana de punto flotante a esos números debe utilizarse en pruebas y un valor distinto de cero para seno y pruebas de tolerancia (como calculado anteriormente) se utilizan para validar los resultados computacionales.
  • Prueba de identidad: Muchas funciones obedecen identidades que son verdaderas para todas las entradas sobre un dominio conocido. Por ejemplo, sin (x) ^ 2 + cos (x) ^ 2 == 1 para todas las entradas x. Otro es arcsin(x) == -i sesión (i * x + sqrt (1 – x 2)). La diferencia entre una prueba de identidad y una prueba de valor especial es que la prueba de identidad es cierto para la entrada arbitraria, Considerando que la prueba de valor especial sólo es válida para un determinado valor de entrada. Como consecuencia, pruebas de identidad validan las relaciones entre funciones.

Usted debe tener cuidado con las pruebas de identidad. Por un lado, algunas identidades están mal condicionadas. Por ejemplo, resultados intermedios pueden crecer a ser bastante grandes, aunque el resultado final es de tamaño moderado. En este caso, pequeños, permisibles errores incurridos durante pasos intermedios en el cálculo pueden causar errores en las pruebas falsas. También, muchas funciones (por ejemplo, las funciones trigonométricas inversas) son varios valores en el plano complejo. A ciegas utilizar pruebas de identidad puede causar errores en las pruebas falsas cuando los lados izquierdo y derecho de la identidad devolución valores correctos acostado hojas de Riemann diferentes en el plano complejo. El probador cuidadosamente debe diseñar pruebas de identidad para evitar estos problemas.

  • Prueba inversa: Se trata de una función compuesta con su inverso y verificar el resultado es el mismo que la entrada a la prueba de informática. Por ejemplo, para positivo x podemos probar log(exp(x)) = x. Usted puede pensar en esto como un caso especial de prueba de identidad, y de hecho es. Sin embargo, porque tantas funciones inversas — y consistencia matemática exige que una función compuesta con su regreso inversa la entrada original: utilizamos una categoría de distintas pruebas para validar que funciona y sus inversos se comportan de manera coherente. Las mismas advertencias que se aplican a las pruebas de identidad (como acondicionado o devoluciones en diferentes hojas de Riemann) también se aplican a prueba inversa.
  • Prueba de suma de serie: Casi todas las funciones trascendentales admiten una expansión de la serie sobre algún dominio de entrada. En la prueba de suma de series, comparamos el valor devuelto por la función bajo prueba al valor devuelto por una serie explícitamente sumada en la prueba. Podría considerar suma de serie como un tipo de prueba de identidad. Sin embargo, las consideraciones que se va a crear una prueba de suma de buena serie son similares a través de funciones (por ejemplo, los criterios de estabilidad y convergencia). Por lo tanto, consideramos que este tipo de pruebas es conceptualmente diferente de prueba de identidad.
  • Expansiones en fracciones continuas: Algunas funciones pueden evaluarse también sobre un dominio conocido mediante una expansión en fracciones continuas. Cuando existe esa expansión, podría convergen mucho más rápidamente que una suma de serie. Por lo tanto, para ciertas funciones, la prueba de suma de la serie podría ser substituida por una fracción continua expansión.
  • Valor calculado la prueba (también conocida como basada en el modelo): En las pruebas de valor calculado, crear una aplicación simple, comprobable correcta de la función dentro de la prueba en sí. Este tipo de prueba no se aplica necesariamente a funciones matemáticas escalares. Sin embargo, un paquete de matemáticas bueno no se limita al conjunto de funciones analíticas. Por ejemplo, considere las funciones como el piso, techo, mod, operadores de concatenación para vectores y así sucesivamente. Cada una de estas funciones puede analizarse mediante la escritura de código que implementa la función utilizando construcciones de lenguaje de la informática básica. Por ejemplo, suelo, techo y la chuleta numérico varias funciones pueden ser modeladas mediante operadores de reparto que conversión el valor de punto flotante en un entero y después conversión el resultado vuelve a un flotador (con algunas matemáticas simples realizadas para imitar el comportamiento exacto de la función bajo consideración). Un beneficio de este tipo de prueba es que la aplicación del modelo es generalmente trivial y por lo tanto es verificable por la inspección.
  • Prueba del error: Estas pruebas Asegúrese de que la entrada no válida se maneje adecuadamente devolviendo un error de limpieza que permite a un programador rápida y claramente entender el problema. Por ejemplo, cuando se trabaja en números reales, sqrt(x) debe devolver un error útil (o NaN) si x < 0. Algunos errores de entrada son conocidos para hacer fallar el equipo si no se maneja de forma adecuada, y trabajo del probador es para asegurarse de que esto no ocurra.

La ventaja de estos tipos de pruebas es que proporcionan una verificación de la corrección de la función usando sólo las matemáticas sí mismo. Porque estos métodos usan la consistencia de las matemáticas como la base de pruebas, está "sabe bien" y no confíe en los cálculos numéricos utilizando software de terceros.

Validar el enfoque

Una forma de apreciar la ventaja de tolerancias números de condición es examinar las tolerancias que se utiliza para validar las funciones matemáticas escalares que tienen singularidades en sus dominios de entrada. Por ejemplo, el tan común de funciones trigonométricas y cuna son singulares en un número infinito de puntos a lo largo de la línea de número real. Si se utilizaron tolerancias fijas y constantes para la validación de la exactitud, dejaría sus pruebas para valores de entrada cerca de las singularidades de estas funciones o las tolerancias pruebas necesariamente sería tan grandes que las pruebas no sería eficaces. Con tolerancias de números de condición, podemos validar las funciones escalares que dentro de un pequeño puñado de cortapisas sobre todo el dominio de entrada de la función. Se muestra en la figura 2 son ejemplos de pasar valores ULP hemos encontrado durante la calificación de funciones distribuidas en el producto Microsoft nube Numerics. Es decir, estos son los valores ULP en que la función correspondiente pasa su prueba.

Figura 2 pasar valores ULP

Función Entrada de dominio Paso ULP Comentario
ATAN2 Números reales 1 Entrada de dos, cuatro cuadrante arctan
Cuna Números reales 3  
Coth Números complejos 3  
Cuberoot Números reales 2  
Ellipe Los números reales x tal que 0 ≤ x ≤ 1 4 E integral elíptica
Ellipk Los números reales x tal que 0 ≤ x ≤ 1 6 K integral elíptica
Expm1 Números reales 3 Exp(x) - 1
Gamma Números reales 3  
Registro Números reales 3  
Registro Números complejos 3  
Log1p Números reales 1 Log(1+x)
Log1p Números complejos 1 Log(1+x)
PSI Números reales 6 Función de PSI, derivados de la función gamma
SQRT Números reales 0 Especificación IEEE requiere esto a ser "mejor redondeado"
Tan Números reales 1  
Tanh Números reales 4  
Tanh Números complejos 4  

La conclusión que se desprende de los ejemplos de figura 2 es que las funciones especiales se implementan utilizando algoritmos que son precisos para dentro de un pequeño número de zanjarlas. El peor de los casos presentados en figura 2 tiene un error de menos de 6 cortapisas, que corresponde a log10(2^6) = 1.8 dígitos decimales de error en los dígitos del número de orden más bajo. Para un doble punto flotante, esto corresponde a un error relativo de 1.3323e-015.

Pruebas de estado-of-the-Art

Para revisar, una rigurosa metodología de pruebas se ha aplicado con éxito a la validación de los algoritmos utilizados en los paquetes de matemáticas Numerics de nube de Microsoft. Utilizando tolerancias pruebas derivadas de los números de la función nos ha permitido identificar y devuelve las implementaciones de funcionamiento incorrecto, incluso cuando produjeron los errores sólo en los últimos pocos dígitos de la función. Fijas las tolerancias de pruebas no pueden proporcionar una prueba rigurosa que también no causa fallas falsas (como singularidades cerca de función). La mayoría de nuestras pruebas involucrados utilizando los valores de entrada y salida de oro valor que son precomputados mediante paquetes de matemáticas de precisión infinita y entonces se almacena en archivos que se leen en el tiempo de prueba. Además de utilizar valores de oro, también realizamos comprobaciones cruzadas en nuestras implementaciones de función usando una variedad de identidades matemáticas para validar el comportamiento de nuestras funciones.

Creemos que los usuarios de Microsoft nube Numerics pueden utilizar su arsenal de funciones matemáticas y estadísticas de la biblioteca y estar seguro de que las funciones han sido investigadas minuciosamente utilizando software de última generación pruebas prácticas.

Para obtener más información, le recomendamos que lea la descripción clásica de David Goldberg de matemáticas de punto flotante, "Lo que cada equipo científico debe saber acerca de coma flotante aritmética," que está disponible en bit.ly/vBhP9m y otros sitios.

Stuart Brorson es un SDET en el centro de NERD de Microsoft en Cambridge, Massachusetts. Se unió a Microsoft cuando la compañía adquirió Supercomputing interactivo, que desarrolló el software que permite a los usuarios ejecutar matemáticos y cálculos de matriz en supercomputadoras paralelas. Para la diversión, Brorson goza de piratería electrónica y tocando violín irlandés en Boston.

Ben Moskowitz es un SDET especializado en pruebas de proyectos basados en matemáticas de Microsoft. Ha contribuido a los lanzamientos de nube Numerics y Fundación de Solver, un paquete de optimización y plataforma que ganó el Premio de Faro de Visual Studio en 2011. Horario, pasa tiempo con su esposa, cuida a sus cabras de vivienda de la ciudad.

Alan Edelman es un profesor de matemáticas y miembro de la informática y laboratorios de AI en el MIT en Cambridge, Massachusetts. Profesor Edelman ha ganado numerosos premios por su trabajo en análisis numérico, la computación paralela y la teoría de la matriz al azar. Él fue el fundador de Supercomputación interactivo, es uno de los fundadores del proyecto Julia, ha aprendido mucho desde Velvel Kahan y ha participado mucho en el consorcio de matemática numérica sobre temas de matemáticas de coma flotante*.***

Gracias al siguiente experto técnico por su ayuda en la revisión de este artículo: Paul Ringseth