web-dev-qa-db-fra.com

Comment convertir des fractions décimales en fractions hexadécimales?

Je me demandais donc comment convertir une fraction décimale en fraction hexadécimale? Quelles sont les méthodes de conversion et existe-t-il des raccourcis?

12
Dusteh

Vous pouvez utiliser cet algorithme:

  1. Prendre une fraction du nombre (c'est-à-dire que la partie entière est égale à zéro)
  2. Multiplier par 16
  3. Convertir une partie entière en hexadécimal et la poser
  4. Aller à l'étape 1

Par exemple, découvrons la représentation hexadécimale de pi = 3.141592653589793 ...

la partie entière est évidente - 0x3 ; comme pour la partie décimale ( 0.141592653589793 ) nous avons

  0.14159265358979 * 16 =  2.26548245743664; int part  2 (0x2); frac 0.26548245743664
  0.26548245743664 * 16 =  4.24771931898624; int part  4 (0x4); frac 0.24771931898624
  0.24771931898624 * 16 =  3.96350910377984; int part  3 (0x3); frac 0.96350910377984
  0.96350910377984 * 16 = 15.41614566047744; int part 15 (0xF); frac 0.41614566047744
  0.41614566047744 * 16 =  6.65833056763904; int part  6 (0x6); frac 0.65833056763904
  0.65833056763904 * 16 = 10.53328908222464; int part 10 (0xA); ...

So pi (hexadécimal) = 3.243F6A ...

Implémentation possible (C #)

public static String ToHex(Double value) {
  StringBuilder Sb = new StringBuilder();

  if (value < 0) {
    Sb.Append('-');

    value = -value;
  }

  // I'm sure you know how to convert decimal integer to its hexadecimal representation
  BigInteger bi = (BigInteger) value;
  Sb.Append(bi.ToString("X"));

  value = value - (Double)bi;

  // We have integer value in fact (e.g. 5.0)
  if (value == 0)
    return Sb.ToString();

  Sb.Append('.');

  // Double is 8 byte and so has at most 16 hexadecimal values
  for (int i = 0; i < 16; ++i) {
    value = value * 16;
    int digit = (int) value;

    Sb.Append(digit.ToString("X"));

    value = value - digit;

    if (value == 0)
      break;
  }

  return Sb.ToString();
}

Tester 

   Console.Write(ToHex(Math.PI)); // <- returns "3.243F6A8885A3"
20
Dmitry Bychenko

Vous pouvez obtenir la partie décimale en multipliant le nombre saisi par un nombre entier de chiffres hexadécimaux. Ensuite, vous pouvez utiliser une conversion normale entière en hexadécimal. Par exemple, pour obtenir 6 caractères après le point décimal (hexa), multipliez la partie décimale par 0x1000000.

Voici du code Java qui le fera.

String toHexFraction(double x, int digits) {
    // Get fractional part.
    if (x < 0.0)
        x = 0.0 - x;
    x = x % 1.0;

    // Shift left by n digits
    long multiplier = (1L << (digits * 4));
    long fraction = (long)(x * multiplier);

    // Convert integer to hex string.
    // String should have at least n digits; prefix with zeros if not.
    String hex = Long.toHexString(fraction);
    String padding = "000000000000000";
    hex = padding.substring(0, digits - hex.length()) + hex;

    return hex;
}

String toHexInteger(double x) {
    long whole = (long) x;
    String prefix;
    if (whole < 0) {
        // Long.toHexString treats the number as an unsigned integer.
        whole = 0 - whole;
        prefix = "-";
    } else {
        prefix = "";
    }
    return Long.toHexString(whole);
}

String toHex (double x, int digits) {
    return toHexInteger(x) + "." + toHexFraction(x, digits);
}

Le nombre de chiffres sera limité par le plus grand entier que vous pouvez représenter dans un double.

Cela devrait également fonctionner pour d'autres bases carrées, par exemple. pour changer octal digits * 4 en digits * 3, et utiliser Long.toOctalString.

0
z0r