Estaba buscando una forma de números flotantes IEEE al formato de punto flotante de IBM para un sistema antiguo que estamos usando. ¿Existe una fórmula general que podamos usar en C# para este fin? Cualquier biblioteca puede ayudar.Convierte de punto flotante de IBM a estándar de coma flotante IEEE y viceversa - ¿C#?
Respuesta
Un enfoque obvio sería utilizar la representación textual del número como formato de intercambio.
// http://en.wikipedia.org/wiki/IBM_Floating_Point_Architecture
// float2ibm(-118.625F) == 0xC276A000
// 1 100 0010 0111 0110 1010 0000 0000 0000
// IBM/370 single precision, 4 bytes
// xxxx.xxxx xxxx.xxxx xxxx.xxxx xxxx.xxxx
// s|-exp--| |--------fraction-----------|
// (7) (24)
// value = (-1)**s * 16**(e - 64) * .f range = 5E-79 ... 7E+75
static int float2ibm(float from)
{
byte[] bytes = BitConverter.GetBytes(from);
int fconv = (bytes[3] << 24) | (bytes[2] << 16) | (bytes[1] << 8)| bytes[0];
if (fconv == 0) return 0;
int fmant = (0x007fffff & fconv) | 0x00800000;
int t = (int)((0x7f800000 & fconv) >> 23) - 126;
while (0 != (t & 0x3)) { ++t; fmant >>= 1; }
fconv = (int)(0x80000000 & fconv) | (((t >> 2) + 64) << 24) | fmant;
return fconv; // big endian order
}
I cambió una pieza de código llama float_to_ibm static void (int de [], int a [], int n, int endian) el código anterior se puede ejecutar correctamente en PC de es poco número de flotador endian. valor de retorno es el número de big endian ibm float pero se almacena en el tipo int.
Esto realmente me salvó la vida, desearía poder recompensarte con 50 puntos de reputación a los dos a toda velocidad y Noam M, simplemente no encuentro cómo. Un aviso: en mi caso, tuve que leer los bytes de la int retornada en orden inverso para obtener la salida imprimible en el archivo codificado windows-1252 (little endian). Fue para SAS XPORT. –
Hace poco tuve que convertir un flotador en otro. Parece que el formato XDR usa un formato impar para sus flotantes. Entonces cuando se convierte de XDR a flotantes estándar, este código lo hizo.
#include <rpc/rpc.h>
// Read in XDR float array, copy to standard float array
// out array needs to be allocated before the function call
bool convertFromXdrFloatArray(float *in, float *out, long size)
{
XDR xdrs;
xdrmem_create(&xdrs,(char *)in, size*sizeof(float), XDR_DECODE);
for(int i = 0; i < size; i++)
{
if(!xdr_float(&xdrs, out++)) {
fprintf(stderr,"%s:%d:ERROR:xdr_float\n",__FILE__,__LINE__);
exit(1);
}
}
xdr_destroy(&xdrs);
return true;
}
Usando primera respuesta añadí la siguiente que puede ser útil en algunos casos:
///
/// Converts an IEEE floating number to its string representation (4 or 8 ascii codes).
/// Useful for SAS XPORT files format.
/// </summary>
/// <param name="from_">IEEE number</param>
/// <param name="padTo8_">When true, output is 8 chars rather than 4</param>
/// <returns>Printable string according to hardware's endianness</returns>
public static string Float2IbmAsAsciiCodes(float from_, bool padTo8_ = true)
{
StringBuilder sb = new StringBuilder();
string s;
byte[] bytes = BitConverter.GetBytes(Float2Ibm(from_)); // big endian order
if (BitConverter.IsLittleEndian)
{
// Revert bytes order
for (int i = 3; i > -1; i--)
sb.Append(Convert.ToChar(bytes[i]));
s = sb.ToString();
if (padTo8_)
s = s.PadRight(8, '\0');
return s;
}
else
{
for (int i = 0; i < 8; i++)
sb.Append(Convert.ToChar(bytes[i]));
s = sb.ToString();
if (padTo8_)
s = s.PadRight(8, '\0');
return s;
}
}
- 1. Cómo comprobar si el compilador de C++ utiliza el estándar de punto flotante IEEE 754
- 2. pitón: desempaquetar IBM de 32 bits punto flotante
- 3. Cálculos en coma flotante IEEE-754, igualdad y estrechamiento
- 4. de coma flotante Limitaciones
- 5. C - redondeo de coma flotante
- 6. Emulación de la multiplicación/adición de coma flotante de IBM en VBA
- 7. Conversión de punto flotante a punto fijo
- 8. Comparación de coma flotante 0
- 9. ¿Qué sucede en C++ cuando un tipo entero se convierte en un tipo de coma flotante o viceversa?
- 10. División de guión y de punto flotante
- 11. Operación de módulo de coma flotante
- 12. Punto flotante determinista y .NET
- 13. Coseno en coma flotante
- 14. precisión de punto flotante en Visual C++
- 15. Tratando con excepciones de punto flotante
- 16. Formato de punto flotante Sphinx
- 17. Límites de punto flotante
- 18. Comparación de punto flotante irreproducibilidad
- 19. Excepción de punto flotante C++ ¿Por qué y qué es?
- 20. números en coma flotante - número más cercano a 1.7
- 21. coma flotante excepción
- 22. comparación de punto flotante de asignación constante
- 23. Codificación de punto flotante crudo
- 24. Problemas de comparación de punto flotante MySQL
- 25. Signo de un número de punto flotante
- 26. Prueba de igualdad de coma flotante. (FE_FLOATING_POINT_EQUALITY)
- 27. Conversión de punto flotante de 32 bits a 16 bits
- 28. Tipos de coma flotante de tamaño fijo
- 29. Números de coma flotante y subnormales de 80 bits
- 30. ensamblador x86: coma flotante comparar
@mekrizzy ya que ambos sistemas pueden convertir flotadores hacia y desde texto puede usar texto como su idioma común. –