Existen dos versiones principales del formato. La versión original fue diseñada para sistemas con limitaciones de memoria y almacenaba números en 32 bits (4 bytes), con una mantisa de 23 bits , un signo de 1 bit y un exponente de 8 bits . El BASIC extendido (12k) incluía un tipo de doble precisión con 64 bits.
Durante el período en el que se estaba trasladando la plataforma Intel 8080 al procesador MOS 6502 , las computadoras comenzaron a comercializarse con más memoria como característica estándar. Esta versión se ofreció con el formato original de 32 bits o con un formato expandido opcional de 40 bits (5 bytes). El formato de 40 bits fue utilizado por la mayoría de las computadoras domésticas de los años 1970 y 1980. Estas dos versiones a veces se conocen como "6 dígitos" y "9 dígitos", respectivamente. [8]
En los ordenadores con procesador x86 , QuickBASIC , antes de la versión 4, reintrodujo el formato de doble precisión utilizando una mantisa de 55 bits en un formato de 64 bits (8 bytes). MBF fue abandonado durante la transición a QuickBASIC 4, que utilizaba el formato estándar IEEE 754 , introducido unos años antes.
Historia
Bill Gates y Paul Allen estaban trabajando en Altair BASIC en 1975. Estaban desarrollando el software en la Universidad de Harvard en un DEC PDP-10 que ejecutaba su emulador Altair . [9] Una cosa que les faltaba era código para manejar números de punto flotante, requerido para soportar cálculos con números muy grandes y muy pequeños, [9] lo que sería particularmente útil para la ciencia y la ingeniería. [10] [11] Uno de los usos propuestos de Altair era como calculadora científica. [12]
En una cena en Currier House , una casa residencial de estudiantes de Harvard, Gates y Allen se quejaron a sus compañeros de cena de que tenían que escribir este código [9] y uno de ellos, Monte Davidoff , les dijo que había escrito rutinas de punto flotante antes y convenció a Gates y Allen de que era capaz de escribir el código de punto flotante de Altair BASIC. [9] En ese momento, si bien IBM había presentado sus propios programas, no había un estándar para números de punto flotante, por lo que Davidoff tuvo que idear el suyo propio. Decidió que 32 bits permitirían suficiente rango y precisión. [13] Cuando Allen tuvo que demostrarlo a MITS , era la primera vez que se ejecutaba en un Altair real. [14] Pero funcionó, y cuando ingresó 'PRINT 2+2', la rutina de suma de Davidoff dio la respuesta correcta. [9]
En 1999 resurgió una copia del código fuente de Altair BASIC. A finales de los años 70, el antiguo tutor y decano de Gates, Harry Lewis, lo había encontrado detrás de unos muebles de una oficina en Aiden y lo había guardado en un archivador. Tras olvidarse más o menos de su existencia durante mucho tiempo, Lewis acabó teniendo la idea de mostrar el listado en el vestíbulo. En su lugar, se decidió conservar el listado original y producir varias copias para su exposición y conservación, después de que la bibliotecaria y conservadora Janice Merrill-Oldham señalara su importancia. [15] [16] Un comentario en la fuente atribuye a Davidoff el mérito de haber escrito el paquete matemático de Altair BASIC. [15] [16]
Altair BASIC despegó, y pronto la mayoría de las primeras computadoras hogareñas ejecutaban alguna forma de Microsoft BASIC. [17] [18] El puerto BASIC para la CPU 6502 , como el utilizado en Commodore PET , ocupaba más espacio debido a la menor densidad de código del 6502. Debido a esto, probablemente no cabría en un solo chip ROM junto con el código de entrada y salida específico de la máquina. Como era necesario un chip adicional, había espacio adicional disponible, y esto se utilizó en parte para extender el formato de punto flotante de 32 a 40 bits. [8] Este formato extendido no solo lo proporcionaban Commodore BASIC 1 y 2, sino que también lo soportaban Applesoft BASIC I y II desde la versión 1.1 (1977), KIM-1 BASIC desde la versión 1.1a (1977) y MicroTAN BASIC desde la versión 2b (1980). [8] No mucho tiempo después, los puertos Z80 , como el BASIC de nivel II para el TRS-80 (1978), introdujeron el formato de 64 bits de precisión doble como un tipo de datos separado del de 32 bits de precisión simple. [19] [20] [21] Microsoft utilizó los mismos formatos de punto flotante en su implementación de Fortran [22] y para su ensamblador de macros MASM , [23] aunque su hoja de cálculo Multiplan [24] [25] y su implementación COBOL utilizaron punto flotante decimal codificado en binario (BCD). [26] Aun así, durante un tiempo MBF se convirtió en el formato de punto flotante de facto en las computadoras domésticas, hasta el punto en que la gente todavía encuentra ocasionalmente archivos heredados y formatos de archivo que lo utilizan. [27] [28] [29] [30] [31] [32]
En un desarrollo paralelo, Intel había comenzado el desarrollo de un coprocesador de punto flotante en 1976. [33] [34] William Morton Kahan , como consultor de Intel, sugirió que Intel utilizara el punto flotante del VAX de Digital Equipment Corporation (DEC). El primer VAX, el VAX-11/780, acababa de salir a finales de 1977, y su punto flotante era muy valorado. Los formatos de punto flotante de VAX se diferenciaban de MBF solo en que tenía el signo en el bit más significativo. [35] [36] Sin embargo, buscando comercializar su chip en el mercado más amplio posible, se le pidió a Kahan que redactara especificaciones. [33] Cuando los rumores del nuevo chip de Intel llegaron a sus competidores, comenzaron un esfuerzo de estandarización, llamado IEEE 754 , para evitar que Intel ganara demasiado terreno. Como un exponente de 8 bits no era lo suficientemente amplio para algunas operaciones deseadas para números de doble precisión, por ejemplo, para almacenar el producto de dos números de 32 bits, [1] la propuesta de Intel y una contrapropuesta de DEC usaron 11 bits, como el formato de punto flotante de 60 bits probado en el tiempo del CDC 6600 de 1965. [34] [37] [38] La propuesta de Kahan también preveía infinitos, que son útiles cuando se trata de condiciones de división por cero; valores que no son números, que son útiles cuando se trata de operaciones no válidas; números desnormalizados , que ayudan a mitigar los problemas causados por el desbordamiento insuficiente; [37] [39] [40] y un sesgo de exponente mejor equilibrado , que podría ayudar a evitar el desbordamiento y el desbordamiento insuficiente al tomar el recíproco de un número. [41] [42]
Cuando se lanzó QuickBASIC 4.00 , [ ¿cuándo? ] el estándar IEEE 754 ya se había adoptado ampliamente; por ejemplo, se incorporó al coprocesador 387 de Intel y a todos los procesadores x86 a partir del 486. Las versiones 4.0 y 4.5 de QuickBASIC utilizan variables de punto flotante IEEE 754 de forma predeterminada, pero (al menos en la versión 4.5) hay una opción de línea de comandos /MBF para el IDE y el compilador que cambia de números de punto flotante IEEE a MBF, para admitir programas escritos anteriormente que se basan en detalles de los formatos de datos MBF. Visual Basic también utiliza el formato IEEE 754 en lugar de MBF.
Detalles técnicos
Los números MBF constan de un exponente de base 2 de 8 bits , un bit de signo (mantisa positiva: s = 0; mantisa negativa: s = 1) y una mantisa de 23, [43] [8] 31 [8] o 55 bits [43] del mantisa . Siempre hay un bit 1 implícito a la izquierda de la mantisa explícita, y el punto de base se ubica antes de este bit asumido . El exponente está codificado con un sesgo de 128 [ cita necesaria ] , de modo que los exponentes −127…−1 [ cita necesaria ] están representados por x = 1…127 (01h…7Fh) [ cita necesaria ] , los exponentes 0…127 [ cita necesaria ] están representados por x = 128…255 (80h…FFh) [ cita necesaria ] , con un caso especial para x = 0 (00h) que representa el número entero siendo cero.
El formato de doble precisión MBF proporciona menos escala que el formato IEEE 754 , y aunque el formato en sí proporciona casi un dígito decimal adicional de precisión, en la práctica los valores almacenados son menos precisos porque los cálculos IEEE utilizan resultados intermedios de 80 bits, y MBF no. [1] [3] [43] [44] A diferencia del punto flotante IEEE, MBF no admite números desnormalizados , infinitos o NaN . [45]
Formato de precisión simple MBF (32 bits, "BASIC de 6 dígitos"): [43] [8]
Formato de precisión extendida MBF (40 bits, "BASIC de 9 dígitos"): [8]
Formato de doble precisión MBF (64 bits): [43] [1]
Ejemplos
"10": [46] [8]
Formato de 32 bits: 84h, 20h, 00h, 00h
Formato de 40 bits: 84h, 20h, 00h, 00h, 00h
"2":
Formato de 32 bits: 82h, 00h, 00h, 00h
Formato de 40 bits: 82h, 00h, 00h, 00h, 00h
"1": [46] [8]
Formato de 32 bits: 81h, 00h, 00h, 00h
Formato de 40 bits: 81h, 00h, 00h, 00h, 00h
"0": [43]
Formato de 32 bits: 00h, 00h, 00h, 00h (o 00h, xxh, xxh, xxh)
Formato de 40 bits: 00h, 00h, 00h, 00h, 00h (o 00h, xxh, xxh, xxh, xxh)
^ abcd "IEEE vs. Formato binario de Microsoft; Problemas de redondeo (Completo)". Soporte técnico de Microsoft . Microsoft . 2006-11-21. ID de artículo KB35826, Q35826. Archivado desde el original el 2020-08-28 . Consultado el 2010-02-24 .
^ "Tutorial (completo) para comprender los errores de punto flotante IEEE". Base de conocimiento . Microsoft . 2005-08-16. ID de artículo KB42980, Q42980. Archivado desde el original el 2020-08-28 . Consultado el 2016-06-02 .
^ ab "Convertir números de punto flotante de C++ anteriores a IEEE-754 a/desde C#". stackoverflow.com . 2010-04-21. Archivado desde el original el 2020-08-28 . Consultado el 2016-06-02 .(NB. La segunda referencia podría ser errónea y decir que QB 4.0 podría usar MBF internamente, pero solo usa IEEE. Solo tiene unas pocas funciones de conversión para convertir números de punto flotante IEEE en cadenas que contienen datos MBF, por ejemplo, MKDMBF$ además de MKD$ que solo copia los bytes del valor IEEE en una cadena).
^ "La documentación de MASM 6.1 señala que 5.1 fue la última versión de MASM compatible con MBF" (PDF) . people.sju.edu . Consultado el 2 de junio de 2016 .
^ Manual del usuario de GW-BASIC, Apéndice D.3 Llamadas de función USR.
^ BASIC Segunda edición (mayo de 1982), IBM: Apéndice C-15 (NB: Este es el manual de BASICA).
^ "Rutas ROM (matemáticas enteras)". Trs-80.com . Consultado el 2 de junio de 2016 .
^ abcdefghijklmnopqr Steil, Michael (2008-10-20). "Cree su propia versión de Microsoft BASIC para 6502". pagetable.com. Archivado desde el original el 2016-05-30 . Consultado el 2016-05-30 .
^ abcde Isaacson, Walter (20 de septiembre de 2013). "El amanecer de una revolución". Harvard Gazette . news.harvard.edu. Archivado desde el original el 28 de agosto de 2020 . Consultado el 30 de mayo de 2016 .
^ Leung, K. Ming (2005-02-03) [2000]. "Números de punto flotante en computadoras digitales" (PDF) . cis.poly.edu . Departamento de Ciencias de la Computación y la Información, Universidad Politécnica. Archivado (PDF) desde el original el 2018-12-14 . Consultado el 2016-06-02 .
^ Becraft, Michael B. (26 de agosto de 2014). Bill Gates: una biografía. Abc-Clio. ISBN978-1-44083014-3. Recuperado el 30 de mayo de 2016 .
^ "El paquete de matemáticas". altairbasic.org . 2014. Archivado desde el original el 28 de agosto de 2020 . Consultado el 30 de mayo de 2016 .(NB. Altair BASIC 3.2 (Edición 4K).)
^ Orlowski, Andrew (11 de mayo de 2001). «La leyenda de Microsoft Altair BASIC habla sobre Linux, CPRM y esa foto aterradora: una entrevista muy poco común con Monte Davidoff». The Register . Archivado desde el original el 28 de agosto de 2020. Consultado el 30 de mayo de 2016 .
^ ab Orlowski, Andrew (13 de mayo de 2001). "Raiders of the Lost Altair BASIC Source Code - They came, they saw… they deassembled" (En busca del código fuente de BASIC de Altair perdido: llegaron, vieron... desmontaron). The Register . Archivado desde el original el 28 de agosto de 2020. Consultado el 30 de mayo de 2016 .
^ ab Griffiths, Ian (8 de mayo de 2000). "Búsqueda de la fuente sagrada: el viaje de Ian a Harvard". Archivado desde el original el 2 de enero de 2002. Consultado el 30 de mayo de 2016 .
^ "Grandes personas personalmente responsables del avance del arte de las primeras computadoras". Oldcomputers.net . 2020-07-18. Archivado desde el original el 2020-08-28 . Consultado el 2016-05-30 .
^ "Basic 7.0 para Windows". comp.lang.basic.powerbasic.narkive.com . Archivado desde el original el 28 de agosto de 2020 . Consultado el 30 de mayo de 2016 .
^ Radio Shack Hardware Manual: Level II BASIC Reference Manual (1.ª edición). Fort Worth, Texas: Radio Shack . 1978. Archivado desde el original el 28 de agosto de 2020. Consultado el 30 de mayo de 2016 .[1]
^ Manual de referencia BASIC de nivel II (PDF) . Radio Shack . 1979 . Consultado el 2 de junio de 2016 .{{cite book}}: |website=ignorado ( ayuda )
^ BASIC-80 (MBASIC) Manual de referencia (PDF) . Consultado el 30 de mayo de 2016 .
^ Microsoft FORTRAN-80 Versión 3.4 Manual del usuario (PDF) . Noviembre de 1980. págs. 45, 55 . Consultado el 30 de mayo de 2016 .{{cite book}}: |website=ignorado ( ayuda )
^ Pätzold, Michael, ed. (Abril de 1993). "Zettelsammlung MS-DOS und AT" (en alemán). Gruppe Datenverarbeitung am MPI für Strömungsforschung Göttingen, Max-Planck-Institut. Archivado desde el original el 20 de febrero de 2005 . Consultado el 7 de octubre de 2015 .
^ "Manual del Tandy 200 Multiplan" (PDF) . classiccmp.org . Consultado el 2 de junio de 2016 .
^ Especificaciones de código P de Microsoft C , página 13. (NB. Multiplan no se compiló en código de máquina, sino en una especie de código de bytes que era ejecutado por un intérprete, para hacer que Multiplan fuera portátil en el hardware muy variable de la época. Este código de bytes distinguía entre el formato de punto flotante específico de la máquina para calcular y un formato externo (estándar), que era decimal codificado en binario (BCD). Las instrucciones PACK y UNPACK convertían entre los dos).
^ Microsoft COBOL-80 (PDF) . 1978. págs. 26, 32. Consultado el 30 de mayo de 2016 .{{cite book}}: |website=ignorado ( ayuda )
^ Lee, Patrick Y. "Diseño de archivo de paquete de correo QWK" (TXT) . textfiles.com . Consultado el 2 de junio de 2016 .
^ "Formato CSI Millennium (CSIM) con extensiones CSI Y2K". csidata.com . Boca Raton, Florida: Commodity Systems, Inc. 1998-11-17. Archivado desde el original (TXT) el 2016-03-05 . Consultado el 2016-06-02 . […] Este documento describe el formato de datos abandonado CompuTrac, que hasta hace poco era utilizado activamente por el software de gráficos MetaStock de Equis. […]
^ Billard, Russ (4 de mayo de 2016) [13 de julio de 2001]. "Conversión del formato binario de Microsoft al formato IEEE mediante VB 6". Archivado desde el original el 28 de agosto de 2020. Consultado el 30 de mayo de 2016 .
^ JerMyster (2003-07-02). "¡Ayuda! ¿Alguien sabe cómo convertir un valor MBF antiguo de M/S de Qbasic a VB6?". Tek-Tips . Foro de Visual Basic (Classic). Archivado desde el original el 28-08-2020 . Consultado el 30-05-2016 .
^ GL88. "Lectura de formato binario (QBasic) con C#". Social.msdn.microsoft.com . Consultado el 30 de mayo de 2016 .{{cite web}}: CS1 maint: nombres numéricos: lista de autores ( enlace )
^ "Rmetrics - Lectura del formato de datos de MetaStock en R". R.789695.n4.nabble.com. 2013-09-30 . Consultado el 2016-05-30 .
^ ab "Intel y el punto flotante: actualización de uno de los estándares más exitosos de la industria: la visión tecnológica para el estándar de punto flotante" (PDF) . Intel . 2016. Archivado desde el original (PDF) el 4 de marzo de 2016 . Consultado el 30 de mayo de 2016 .(11 páginas)
^ ab "Una entrevista con el anciano del punto flotante". cs.berkeley.edu. 1998-02-20 . Consultado el 2016-05-30 .
^ "Números de punto flotante del VAX". nssdc.gsfc.nasa.gov . Archivado desde el original el 28 de agosto de 2020. Consultado el 2 de junio de 2016 .(NB. El VAX-11/780 no implementó aún el formato "G". Aunque esto no es directamente evidente en las tablas porque las estructuras han sido cortadas en palabras de dos bytes, el orden de bytes es en realidad el mismo que en las CPU modernas. No hay suficiente espacio en el rango de exponentes para NaN, infinitos, infinitos o denormales).
^ "VAX11 780" (PDF) . Ece.cmu.edu . Consultado el 2 de junio de 2016 .
^ ab "IEEE 754: Una entrevista con William Kahan" (PDF) . dr-chuck.com . Consultado el 2 de junio de 2016 .
^ Thornton, James E. (1970). Escrito en Advanced Design Laboratory, Control Data Corporation. Diseño de una computadora: Control Data 6600 (PDF) (1.ª ed.). Glenview, Illinois: Scott, Foresman and Company . LCCN 74-96462. Archivado (PDF) desde el original el 28 de agosto de 2020. Consultado el 2 de junio de 2016 .(1+13+181+2+2 páginas)
^ Kahan, William Morton . "¿Por qué necesitamos un estándar aritmético de punto flotante?" (PDF) . cs.berkeley.edu . Consultado el 2 de junio de 2016 .
^ Kahan, William Morton ; Darcy, Joseph D. "Cómo el punto flotante de Java perjudica a todos en todas partes" (PDF) . cs.berkeley.edu . Consultado el 2 de junio de 2016 .
^ Turner, Peter R. (21 de diciembre de 2013). Análisis numérico y procesamiento paralelo: conferencias dictadas en The Lancaster …. Springer. ISBN978-3-66239812-8. Recuperado el 30 de mayo de 2016 .
^ "Nombres para formatos de coma flotante estandarizados" (PDF) . cs.berkeley.edu . Consultado el 2 de junio de 2016 .
^ abcdef Borland staff (1998-07-02) [1994-03-10]. "Conversión entre formatos Microsoft Binary e IEEE". Base de datos de información técnica (TI1431C.txt). Embarcadero USA / Inprise (originalmente: Borland ). ID 1400. Archivado desde el original el 2019-02-20 . Consultado el 2016-05-30 . […] _fmsbintoieee(float *src4, float *dest4) […] Formato binario MS […] orden de bytes => m3 | m2 | m1 | exponente […] m1 es el byte más significativo => sbbb|bbbb […] m3 es el byte menos significativo […] m = byte de mantisa […] s = bit de signo […] b = bit […] MBF es sesgo 128 e IEEE es sesgo 127. […] MBF coloca el punto decimal antes del bit asumido , mientras que IEEE coloca el punto decimal después del bit asumido. […] ieee_exp = msbin[3] - 2; /* en realidad, msbin[3]-1-128+127 */ […] _dmsbintoieee(double *src8, double *dest8) […] Formato binario MS […] orden de bytes => m7 | m6 | m5 | m4 | m3 | m2 | m1 | exponente […] m1 es el byte más significativo => smmm|mmmm […] m7 es el byte menos significativo […] MBF tiene un sesgo de 128 y IEEE tiene un sesgo de 1023. […] MBF coloca el punto decimal antes del bit asumido, mientras que IEEE coloca el punto decimal después del bit asumido. […] ieee_exp = msbin[7] - 128 - 1 + 1023; […]
^ "Grupos de Google". Groups.google.com . Consultado el 2 de junio de 2016 .
^ Bucknall, Julian M. (2018-11-03) [2007-10-23]. "Entendiendo la precisión simple MBF". boyet.com. Archivado desde el original el 2019-02-20 . Consultado el 2016-05-30 . […] Formato simple IEEE 754 […] El exponente está sesgado por 127. Hay un bit 1 asumido antes del punto de base (por lo que la mantisa asumida es 1.ffff… donde f son los bits de fracción ) […] Formato binario de Microsoft (precisión simple) […] El exponente está sesgado por 128. Hay un bit 1 asumido después del punto de base (por lo que la mantisa asumida es 0.1ffff… donde f son los bits de fracción) […] la mantisa IEEE es el doble de la mantisa MBF. […] para convertir de MBF a IEEE single […] reste 2 al exponente (uno para el cambio de polarización, uno para el factor de mantisa) y luego reorganice los bits de signo y exponente. La fracción no cambia. Para convertir de IEEE single a MBF, […] agregue 2 al exponente (uno para el cambio de polarización, uno para el factor de mantisa) y luego reorganice los bits de signo y exponente. La fracción no cambia. […]
^ abcdefgh Steil, Michael, ed. (2008-10-20). «msbasic/float.s». MIST64 . Archivado desde el original el 2020-08-28 . Consultado el 2020-08-28 – vía github.com.[2] (NB. Listados de desensamblaje comentados de 6502, fusionados a partir de varias versiones de Microsoft BASIC para 6502 entre 1977 y 1982 para recrear copias exactas en bytes de las ROM originales para 10 máquinas diferentes de distintos proveedores).
^ abc Steil, Michael, ed. (2008-10-20). "msbasic/trig.s". MIST64 . Archivado desde el original el 2020-08-28 . Consultado el 2020-08-28 – vía github.com.[3] (NB. Listados de desensamblaje comentados de 6502, fusionados a partir de varias versiones de Microsoft BASIC para 6502 entre 1977 y 1982 para recrear copias exactas en bytes de las ROM originales para 10 máquinas diferentes de distintos proveedores).
Lectura adicional
Allen, Paul ; Gates, Bill ; Davidoff, Monte (marzo de 2019) [1975]. Harris, Reuben; Mangin, Charles (eds.). "Altair BASIC 3.2 (4K) - Desmontaje anotado". altairbasic.org . Archivado desde el original el 2024-03-29 . Consultado el 2024-03-29 .[4]
Harris, Reuben, ed. (2014) [1975]. "El paquete de matemáticas". altairbasic.org . Archivado desde el original el 2024-03-29 . Consultado el 2024-03-29 .
Enlaces externos
Microsoft proporciona una biblioteca de vínculos dinámicos para Visual Basic de 16 bits que contiene funciones para convertir entre datos MBF e IEEE 754.
Esta biblioteca envuelve las funciones de conversión de MBF en el CRT Visual C(++) de 16 bits.
Estas funciones de conversión redondearán un número de doble precisión IEEE como ¾ ⋅ 2 −128 a cero en lugar de a 2 −128 .
No admiten desnormalizaciones en absoluto: el número de precisión simple IEEE o MBF 2 −128 se convertirá en cero, aunque sea representable en cualquiera de los formatos.
Esta biblioteca solo está diseñada para usarse con Visual Basic; se espera que los programas C(++) llamen directamente a las funciones CRT.