Szukałem sposobu na liczbowe numery zmiennoprzecinkowe IEEE do formatu zmiennoprzecinkowego IBM dla starego systemu, którego używamy. Czy istnieje ogólna formuła, której możemy użyć w C# do tego celu. Może pomóc każda biblioteka tat.Konwertuj z IBM zmiennoprzecinkowy na standard zmiennoprzecinkowy IEEE i Vice Versa-In C#?
Odpowiedz
Oczywistym podejściem byłoby użycie tekstowej reprezentacji liczby jako formatu wymiany.
// 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
}
zmieniłem kawałek kodu nazywa static void float_to_ibm (int od [], int na [], int n, int endian) powyższy kod może działać poprawnie w komputerze z jest mało endian float number. wartość zwracana to duża liczba endianowa ibm, ale przechowywana w typie int.
To naprawdę uratowało mi życie, chciałbym móc nagrodzić cię 50 punktami reputacji dla was obu, którzy pędzili i Noam M, po prostu nie wiem jak. Uwaga: w moim przypadku musiałem odczytać bajty zwróconej int w odwrotnej kolejności, aby uzyskać wydrukowane wyjście do pliku zakodowanego Windows-1252 (little endian). To było dla SAS XPORT. –
Niedawno musiałem zamienić jeden płyn na inny. Wygląda na to, że format XDR używa nieparzystego formatu dla jego spławów. Tak więc podczas konwersji z XDR na standardowe pływaki, ten kod to zrobił.
#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;
}
Korzystanie pierwsza odpowiedź dodałem następujące, które mogą być przydatne w niektórych przypadkach:
///
/// 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. Konwertuj IEEE 754 na dziesiętny zmiennoprzecinkowy
- 2. Konwertuj int na 16-bitowy zmiennoprzecinkowy (połowa zmiennoprzecinkowa) w C++
- 3. Wyjątek zmiennoprzecinkowy (core dumped)
- 4. Numer zmiennoprzecinkowy w formacie
- 5. Wyjątek zmiennoprzecinkowy (zrzut rdzenia
- 6. Czym dokładnie jest tekst zmiennoprzecinkowy?
- 7. wyjątkowy zmiennoprzecinkowy po podzieleniu na x86 NASM
- 8. stałej szerokości zmiennoprzecinkowy format numeru
- 9. Podział zmiennoprzecinkowy w pliku wsadowym
- 10. Rejon zmiennoprzecinkowy dzielony przez zero w Delphi5
- 11. Precyzyjny zmiennoprzecinkowy <-> konwersja ciągów
- 12. Co oznacza błąd zmiennoprzecinkowy -1. # J?
- 13. Punkt zmiennoprzecinkowy powoduje podział całkowity Bash
- 14. Jak wysłać kod USSD zawierający dziesiętny zmiennoprzecinkowy (.)?
- 15. Android: zmiennoprzecinkowy przycisk akcji w złym położeniu
- 16. Punkt zmiennoprzecinkowy podwójnej precyzji w CUDA
- 17. Jak przekonwertować pomiar wyświetlany w formacie architektonicznym na zmiennoprzecinkowy?
- 18. Jak przekonwertować float sześciokątny na zmiennoprzecinkowy w C/C++ za pomocą _mm_extract_ps SSE GCC instrinc function
- 19. android: dynamicznie zmienia ikonę FAB (zmiennoprzecinkowy przycisk) z kodu
- 20. Dlaczego podział liczb całkowitych przez zero powoduje wyjątek zmiennoprzecinkowy?
- 21. Mnożenie liczby całkowitej przez literał zmiennoprzecinkowy - czy wymagane jest "F"?
- 22. Typ danych łańcuchowy, dziesiętny lub zmiennoprzecinkowy dla pola cenowego?
- 23. Jak mogę zadeklarować zmienną klasy jako punkt zmiennoprzecinkowy w Moose?
- 24. C++ layout Standard i Referencje
- 25. Konwertowanie znaków zenkaku na hankaku i vice versa w C#
- 26. Jak przekonwertować frakturę sformatowaną na ułamek dziesiętny lub zmiennoprzecinkowy w języku Java?
- 27. Konwersja NSString na NSData i vice versa
- 28. przekazywanie wskaźników od C do C++ i vice versa
- 29. C standard definicji struktury
- 30. Skąd miałbym pomysł na następny standard C?
@mekrizzy gdyż oba systemy mogą konwertować pływaki do iz tekst możesz użyć tekstu jako wspólnego języka. –