Hallo Leute.
Ich habe schon wieder eine Frage.
Und zwar war ich gerade dabei meine MathUtils um eine BigFloat Klasse zu erweitern, da eine solche ja im Framework leider fehlt. Dabei bin ich so vorgegangen, dass ich einen Exponenten und eine Mantisse als BigInteger speichere, eben so wie es bei normalen Gleitkommazahlen auch gemacht wird.
Der bisherige Code sieht so aus:
Spoiler anzeigen
Nun bin ich jedoch auf einige Schwierigkeiten gestoßen.
Zum einen wäre das die Konvertierung aus Decimal. Dieser Datentyp wird nicht mit Exponent und Mantisse, sondern auf eine andere Art gespeichert, bei der ich nicht weiß, wie ich sie konvertieren kann.
Zum anderen wäre dies die Darstellung. Ich hab leider keinen Plan, wie ich die Stringdarstellung generieren soll, da die Ausgabe ja dezimal sein soll, der Exponent aber binär vorliegt.
Außerdem würde ich mich freuen, wenn jemand mal den bisherigen Code auf Richtigkeit prüfen könnte.
Ich habe schon wieder eine Frage.
Und zwar war ich gerade dabei meine MathUtils um eine BigFloat Klasse zu erweitern, da eine solche ja im Framework leider fehlt. Dabei bin ich so vorgegangen, dass ich einen Exponenten und eine Mantisse als BigInteger speichere, eben so wie es bei normalen Gleitkommazahlen auch gemacht wird.
Der bisherige Code sieht so aus:
C#-Quellcode
- public struct BigFloat : IComparable, IComparable<BigFloat>, IEquatable<BigFloat>
- {
- sbyte sign;
- BigInteger exponent;
- BigInteger mantissa;
- public BigFloat(float value)
- : this()
- {
- var desc = GetSingleDescription(value);
- sign = desc.sign;
- exponent = desc.exponent;
- mantissa = desc.mantissa;
- }
- public BigFloat(double value)
- : this()
- {
- var desc = GetDoubleDescription(value);
- sign = desc.sign;
- exponent = desc.exponent;
- mantissa = desc.mantissa;
- }
- public BigFloat(decimal value)
- : this()
- {
- var desc = GetDecimalDescription(value);
- sign = desc.sign;
- exponent = desc.exponent;
- mantissa = desc.mantissa;
- }
- public BigFloat(long value)
- : this()
- {
- var desc = GetInt64Description(value);
- sign = desc.sign;
- exponent = desc.exponent;
- mantissa = desc.mantissa;
- }
- private struct FloatDescription
- {
- internal sbyte sign;
- internal BigInteger exponent;
- internal BigInteger mantissa;
- }
- private FloatDescription GetSingleDescription(float value)
- {
- var desc = new FloatDescription();
- desc.sign = value < 0 ? (sbyte)-1 : (sbyte)0;
- uint rawBits;
- unsafe
- {
- rawBits = *(uint*)&value;
- }
- var rawExponent = (rawBits & 0x7F800000U) >> 23;
- var rawMantissa = rawBits & 0x7FFFFFU;
- desc.exponent = new BigInteger((int)rawExponent - 127);
- desc.mantissa = new BigInteger((1U << 23) + rawMantissa);
- return desc;
- }
- private FloatDescription GetDoubleDescription(double value)
- {
- var desc = new FloatDescription();
- desc.sign = value < 0 ? (sbyte)-1 : (sbyte)0;
- ulong rawBits;
- unsafe
- {
- rawBits = *(ulong*)&value;
- }
- var rawExponent = (rawBits & 0x7FF0000000000000UL) >> 52;
- var rawMantissa = rawBits & 0xFFFFFFFFFFFFFUL;
- desc.exponent = new BigInteger((long)rawExponent - 1023);
- desc.mantissa = new BigInteger((1UL << 52) + rawMantissa);
- return desc;
- }
- private FloatDescription GetDecimalDescription(decimal value)
- {
- var desc = new FloatDescription();
- desc.sign = value < 0 ? (sbyte)-1 : (sbyte)0;
- var bits = decimal.GetBits(value);
- return desc;
- }
- private FloatDescription GetInt64Description(long value)
- {
- var desc = new FloatDescription();
- desc.sign = value < 0 ? (sbyte)-1 : (sbyte)0;
- desc.exponent = new BigInteger(Convert.ToString(System.Math.Abs(value), 2).Length - 1);
- desc.mantissa = new BigInteger(System.Math.Abs(value));
- return desc;
- }
- public int CompareTo(object obj)
- {
- throw new NotImplementedException();
- }
- public int CompareTo(BigFloat other)
- {
- throw new NotImplementedException();
- }
- public bool Equals(BigFloat other)
- {
- throw new NotImplementedException();
- }
- }
Nun bin ich jedoch auf einige Schwierigkeiten gestoßen.
Zum einen wäre das die Konvertierung aus Decimal. Dieser Datentyp wird nicht mit Exponent und Mantisse, sondern auf eine andere Art gespeichert, bei der ich nicht weiß, wie ich sie konvertieren kann.
Zum anderen wäre dies die Darstellung. Ich hab leider keinen Plan, wie ich die Stringdarstellung generieren soll, da die Ausgabe ja dezimal sein soll, der Exponent aber binär vorliegt.
Außerdem würde ich mich freuen, wenn jemand mal den bisherigen Code auf Richtigkeit prüfen könnte.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Artentus“ ()