This is an automated email from the ASF dual-hosted git repository.
mseidel pushed a commit to branch Pilot-Pirx-patch-1
in repository https://gitbox.apache.org/repos/asf/openoffice.git
The following commit(s) were added to refs/heads/Pilot-Pirx-patch-1 by this
push:
new e3c47441a9 Additional files
e3c47441a9 is described below
commit e3c47441a9a58c125bae01cb7f6e0d84f3e59baf
Author: mseidel <[email protected]>
AuthorDate: Fri Oct 17 15:35:35 2025 +0200
Additional files
---
main/tools/source/generic/fract.cxx | 802 ++++++++++++++++++------------------
1 file changed, 401 insertions(+), 401 deletions(-)
diff --git a/main/tools/source/generic/fract.cxx
b/main/tools/source/generic/fract.cxx
index b57b52a657..86ce98857d 100644
--- a/main/tools/source/generic/fract.cxx
+++ b/main/tools/source/generic/fract.cxx
@@ -19,8 +19,6 @@
*
*************************************************************/
-
-
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_tools.hxx"
@@ -37,88 +35,88 @@
|*
|* GetGGT()
|*
-|* Beschreibung Berechnet den groessten gemeinsamen Teiler von
+|* Beschreibung Berechnet den gr��ten gemeinsamen Teiler von
|* nVal1 und nVal2
|* Parameter long nVal1, long nVal2
|* Ersterstellung DV 20.09.90
-|* Letzte Aenderung DV 21.12.92
+|* Letzte �nderung DV 21.12.92
|*
*************************************************************************/
-// Die Funktion GetGGT berechnet den groessten gemeinsamen Teiler der
-// beiden als Parameter uebergebenen Werte nVal1 und nVal2 nach dem
+// Die Funktion GetGGT berechnet den gr��ten gemeinsamen Teiler der
+// beiden als Parameter �bergebenen Werte nVal1 und nVal2 nach dem
// Algorithmus von Euklid. Hat einer der beiden Parameter den Wert 0 oder
-// 1, so wird als Ergebnis der Wert 1 zur�ckgegeben. Da der Algorithmus
+// 1, so wird als Ergebnis der Wert 1 zur�ckgegeben. Da der Algorithmus
// nur mit positiven Zahlen arbeitet, werden die beiden Parameter
// entsprechend umgewandelt.
-// Zum Algorithmus: die beiden Parameter werden solange ducheinander
+// Zum Algorithmus: die beiden Parameter werden solange durcheinander
// geteilt, bis sie beide gleich sind oder bis bei der Division
// kein Rest bleibt. Der kleinere der beiden Werte ist dann der
// GGT.
static long GetGGT( long nVal1, long nVal2 )
{
- nVal1 = Abs( nVal1 );
- nVal2 = Abs( nVal2 );
-
- if ( nVal1 <= 1 || nVal2 <= 1 )
- return 1;
-
- while ( nVal1 != nVal2 )
- {
- if ( nVal1 > nVal2 )
- {
- nVal1 %= nVal2;
- if ( nVal1 == 0 )
- return nVal2;
- }
- else
- {
- nVal2 %= nVal1;
- if ( nVal2 == 0 )
- return nVal1;
- }
- }
-
- return nVal1;
+ nVal1 = Abs( nVal1 );
+ nVal2 = Abs( nVal2 );
+
+ if ( nVal1 <= 1 || nVal2 <= 1 )
+ return 1;
+
+ while ( nVal1 != nVal2 )
+ {
+ if ( nVal1 > nVal2 )
+ {
+ nVal1 %= nVal2;
+ if ( nVal1 == 0 )
+ return nVal2;
+ }
+ else
+ {
+ nVal2 %= nVal1;
+ if ( nVal2 == 0 )
+ return nVal1;
+ }
+ }
+
+ return nVal1;
}
static void Reduce( BigInt &rVal1, BigInt &rVal2 )
{
- BigInt nA( rVal1 );
- BigInt nB( rVal2 );
- nA.Abs();
- nB.Abs();
-
- if ( nA.IsOne() || nB.IsOne() || nA.IsZero() || nB.IsZero() )
- return;
-
- while ( nA != nB )
- {
- if ( nA > nB )
- {
- nA %= nB;
- if ( nA.IsZero() )
+ BigInt nA( rVal1 );
+ BigInt nB( rVal2 );
+ nA.Abs();
+ nB.Abs();
+
+ if ( nA.IsOne() || nB.IsOne() || nA.IsZero() || nB.IsZero() )
+ return;
+
+ while ( nA != nB )
+ {
+ if ( nA > nB )
+ {
+ nA %= nB;
+ if ( nA.IsZero() )
{
- rVal1 /= nB;
- rVal2 /= nB;
+ rVal1 /= nB;
+ rVal2 /= nB;
return;
}
- }
- else
- {
- nB %= nA;
- if ( nB.IsZero() )
+ }
+ else
+ {
+ nB %= nA;
+ if ( nB.IsZero() )
{
- rVal1 /= nA;
- rVal2 /= nA;
+ rVal1 /= nA;
+ rVal2 /= nA;
return;
}
- }
- }
+ }
+ }
- rVal1 /= nA;
- rVal2 /= nB;
+ rVal1 /= nA;
+ rVal2 /= nB;
}
/*************************************************************************
@@ -127,7 +125,7 @@ static void Reduce( BigInt &rVal1, BigInt &rVal2 )
|*
|* Beschreibung FRACT.SDW
|* Ersterstellung WP 07.03.97
-|* Letzte Aenderung
+|* Letzte �nderung
|*
*************************************************************************/
@@ -141,19 +139,19 @@ Fraction::Fraction( long nN1, long nN2, long nD1, long
nD2 )
if( nD1 < 0 ) { i = -i; nD1 = -nD1; }
if( nD2 < 0 ) { i = -i; nD2 = -nD2; }
- n = GetGGT( nN1, nD1 ); if( n > 1 ) { nN1 /= n; nD1 /= n; }
- n = GetGGT( nN1, nD2 ); if( n > 1 ) { nN1 /= n; nD2 /= n; }
- n = GetGGT( nN2, nD1 ); if( n > 1 ) { nN2 /= n; nD1 /= n; }
- n = GetGGT( nN2, nD2 ); if( n > 1 ) { nN2 /= n; nD2 /= n; }
+ n = GetGGT( nN1, nD1 ); if( n > 1 ) { nN1 /= n; nD1 /= n; }
+ n = GetGGT( nN1, nD2 ); if( n > 1 ) { nN1 /= n; nD2 /= n; }
+ n = GetGGT( nN2, nD1 ); if( n > 1 ) { nN2 /= n; nD1 /= n; }
+ n = GetGGT( nN2, nD2 ); if( n > 1 ) { nN2 /= n; nD2 /= n; }
- BigInt nN( nN1 );
- nN *= BigInt( nN2 );
+ BigInt nN( nN1 );
+ nN *= BigInt( nN2 );
- BigInt nD( nD1 );
- nD *= BigInt( nD2 );
+ BigInt nD( nD1 );
+ nD *= BigInt( nD2 );
- while ( nN.bIsBig || nD.bIsBig )
- {
+ while ( nN.bIsBig || nD.bIsBig )
+ {
BigInt n1 = 1;
BigInt n2 = 2;
@@ -162,12 +160,12 @@ Fraction::Fraction( long nN1, long nN2, long nD1, long
nD2 )
nD += n1;
nD /= n2;
- // Kuerzen ueber Groesste Gemeinsame Teiler
- Reduce( nN, nD );
- }
+ // K�rzen �ber Gr��te Gemeinsame Teiler
+ Reduce( nN, nD );
+ }
- nNumerator = i * (long)nN;
- nDenominator = (long)nD;
+ nNumerator = i * (long)nN;
+ nDenominator = (long)nD;
}
/*************************************************************************
@@ -176,30 +174,30 @@ Fraction::Fraction( long nN1, long nN2, long nD1, long
nD2 )
|*
|* Beschreibung FRACT.SDW
|* Ersterstellung DV 20.09.90
-|* Letzte Aenderung DV 21.12.92
+|* Letzte �nderung DV 21.12.92
|*
*************************************************************************/
-// Zur Initialisierung eines Bruches wird nNum dem Zaehler und nDen dem
+// Zur Initialisierung eines Bruches wird nNum dem Z�hler und nDen dem
// Nenner zugewiesen. Da negative Werte des Nenners einen Bruch als
-// ungueltig kennzeichnen, wird bei der Eingabe eines negativen Nenners
-// sowohl das Vorzeichen des Nenners und des Zaehlers invertiert um wieder
-// einen gueltigen Wert fuer den Bruch zu erhalten.
+// ung�ltig kennzeichnen, wird bei der Eingabe eines negativen Nenners
+// sowohl das Vorzeichen des Nenners und des Z�hlers invertiert um wieder
+// einen g�ltigen Wert f�r den Bruch zu erhalten.
Fraction::Fraction( long nNum, long nDen )
{
- nNumerator = nNum;
- nDenominator = nDen;
- if ( nDenominator < 0 )
- {
- nDenominator = -nDenominator;
- nNumerator = -nNumerator;
- }
-
- // Kuerzen ueber Groesste Gemeinsame Teiler
- long n = GetGGT( nNumerator, nDenominator );
- nNumerator /= n;
- nDenominator /= n;
+ nNumerator = nNum;
+ nDenominator = nDen;
+ if ( nDenominator < 0 )
+ {
+ nDenominator = -nDenominator;
+ nNumerator = -nNumerator;
+ }
+
+ // K�rzen �ber Gr��te Gemeinsame Teiler
+ long n = GetGGT( nNumerator, nDenominator );
+ nNumerator /= n;
+ nDenominator /= n;
}
/*************************************************************************
@@ -208,40 +206,40 @@ Fraction::Fraction( long nNum, long nDen )
|*
|* Beschreibung FRACT.SDW
|* Ersterstellung DV 20.09.90
-|* Letzte Aenderung DV 21.12.92
+|* Letzte �nderung DV 21.12.92
|*
*************************************************************************/
-// Wenn der Wert von dVal groesser ist als LONG_MAX, dann wird der Bruch
-// auf den Wert ungueltig gesetzt, ansonsten werden dVal und der Nenner
-// solange mit 10 multipliziert, bis entweder der Zaehler oder der Nenner
-// groesser als LONG_MAX / 10 ist. Zum Schluss wird der so entstandene Bruch
-// gekuerzt.
+// Wenn der Wert von dVal gr��er ist als LONG_MAX, dann wird der Bruch
+// auf den Wert ung�ltig gesetzt, ansonsten werden dVal und der Nenner
+// solange mit 10 multipliziert, bis entweder der Z�hler oder der Nenner
+// gr��er als LONG_MAX / 10 ist. Zum Schluss wird der so entstandene Bruch
+// gek�rzt.
Fraction::Fraction( double dVal )
{
- long nDen = 1;
- long nMAX = LONG_MAX / 10;
-
- if ( dVal > LONG_MAX || dVal < LONG_MIN )
- {
- nNumerator = 0;
- nDenominator = -1;
- return;
- }
-
- while ( Abs( (long)dVal ) < nMAX && nDen < nMAX )
- {
- dVal *= 10;
- nDen *= 10;
- }
- nNumerator = (long)dVal;
- nDenominator = nDen;
-
- // Kuerzen ueber Groesste Gemeinsame Teiler
- long n = GetGGT( nNumerator, nDenominator );
- nNumerator /= n;
- nDenominator /= n;
+ long nDen = 1;
+ long nMAX = LONG_MAX / 10;
+
+ if ( dVal > LONG_MAX || dVal < LONG_MIN )
+ {
+ nNumerator = 0;
+ nDenominator = -1;
+ return;
+ }
+
+ while ( Abs( (long)dVal ) < nMAX && nDen < nMAX )
+ {
+ dVal *= 10;
+ nDen *= 10;
+ }
+ nNumerator = (long)dVal;
+ nDenominator = nDen;
+
+ // K�rzen �ber Gr��te Gemeinsame Teiler
+ long n = GetGGT( nNumerator, nDenominator );
+ nNumerator /= n;
+ nDenominator /= n;
}
/*************************************************************************
@@ -250,16 +248,16 @@ Fraction::Fraction( double dVal )
|*
|* Beschreibung FRACT.SDW
|* Ersterstellung DV 20.09.90
-|* Letzte Aenderung DV 14.05.91
+|* Letzte �nderung DV 14.05.91
|*
*************************************************************************/
Fraction::operator double() const
{
- if ( nDenominator > 0 )
- return (double)nNumerator / (double)nDenominator;
- else
- return (double)0;
+ if ( nDenominator > 0 )
+ return (double)nNumerator / (double)nDenominator;
+ else
+ return (double)0;
}
/*************************************************************************
@@ -268,54 +266,54 @@ Fraction::operator double() const
|*
|* Beschreibung FRACT.SDW
|* Ersterstellung DV 20.09.90
-|* Letzte Aenderung DV 21.12.92
+|* Letzte �nderung DV 21.12.92
|*
*************************************************************************/
-// Zunaechst werden die beiden Parameter auf ihre Gueltigkeit ueberprueft.
-// Ist einer der Parameter ungueltig, dann ist auch des Ergebnis
-// ungueltig. Zur Addition werden die beiden Brueche erst durch
+// Zun�chst werden die beiden Parameter auf ihre G�ltigkeit �berpr�ft.
+// Ist einer der Parameter ung�ltig, dann ist auch des Ergebnis
+// ung�ltig. Zur Addition werden die beiden Br�che erst durch
// Erweiterung mit den Nenner des jeweils anderen Bruches auf einen
-// gemeinsamen Nenner gebracht. Anschliessend werden die beiden Zaehler
-// addiert und das Ergebnis gekuerzt (durch Division von Zaehler und
+// gemeinsamen Nenner gebracht. Anschlie�end werden die beiden Z�hler
+// addiert und das Ergebnis gek�rzt (durch Division von Z�hler und
// Nenner mit nGGT). Innerhalb der Funktion wird mit dem Datentyp SLong
-// gerechnet, um einen Moeglichen Ueberlauf erkennen zu koennen. Bei
-// einem Ueberlauf wird das Ergebnis auf den Wert ungueltig gesetzt.
+// gerechnet, um einen m�glichen �berlauf erkennen zu k�nnen. Bei
+// einem �berlauf wird das Ergebnis auf den Wert ung�ltig gesetzt.
Fraction& Fraction::operator += ( const Fraction& rVal )
{
- if ( !rVal.IsValid() )
- {
- nNumerator = 0;
- nDenominator = -1;
- }
- if ( !IsValid() )
- return *this;
-
- // (a/b) + (c/d) = ( (a*d) + (c*b) ) / (b*d)
- BigInt nN( nNumerator );
- nN *= BigInt( rVal.nDenominator );
- BigInt nW1Temp( nDenominator );
- nW1Temp *= BigInt( rVal.nNumerator );
- nN += nW1Temp;
-
- BigInt nD( nDenominator );
- nD *= BigInt( rVal.nDenominator );
-
- Reduce( nN, nD );
-
- if ( nN.bIsBig || nD.bIsBig )
- {
- nNumerator = 0;
- nDenominator = -1;
- }
- else
- {
- nNumerator = (long)nN,
- nDenominator = (long)nD;
- }
-
- return *this;
+ if ( !rVal.IsValid() )
+ {
+ nNumerator = 0;
+ nDenominator = -1;
+ }
+ if ( !IsValid() )
+ return *this;
+
+ // (a/b) + (c/d) = ( (a*d) + (c*b) ) / (b*d)
+ BigInt nN( nNumerator );
+ nN *= BigInt( rVal.nDenominator );
+ BigInt nW1Temp( nDenominator );
+ nW1Temp *= BigInt( rVal.nNumerator );
+ nN += nW1Temp;
+
+ BigInt nD( nDenominator );
+ nD *= BigInt( rVal.nDenominator );
+
+ Reduce( nN, nD );
+
+ if ( nN.bIsBig || nD.bIsBig )
+ {
+ nNumerator = 0;
+ nDenominator = -1;
+ }
+ else
+ {
+ nNumerator = (long)nN,
+ nDenominator = (long)nD;
+ }
+
+ return *this;
}
/*************************************************************************
@@ -324,54 +322,54 @@ Fraction& Fraction::operator += ( const Fraction& rVal )
|*
|* Beschreibung FRACT.SDW
|* Ersterstellung DV 20.09.90
-|* Letzte Aenderung DV 21.12.92
+|* Letzte �nderung DV 21.12.92
|*
*************************************************************************/
-// Zunaechst werden die beiden Parameter auf ihre Gueltigkeit ueberprueft.
-// Ist einer der Parameter ungueltig, dann ist auch des Ergebnis
-// ungueltig. Zur Subtraktion werden die beiden Brueche erst durch
+// Zun�chst werden die beiden Parameter auf ihre G�ltigkeit �berpr�ft.
+// Ist einer der Parameter ung�ltig, dann ist auch des Ergebnis
+// ung�ltig. Zur Subtraktion werden die beiden Br�che erst durch
// Erweiterung mit den Nenner des jeweils anderen Bruches auf einen
-// gemeinsamen Nenner gebracht. Anschliessend werden die beiden Zaehler
-// subtrahiert und das Ergebnis gekuerzt (durch Division von Zaehler und
+// gemeinsamen Nenner gebracht. Anschlie�end werden die beiden Z�hler
+// subtrahiert und das Ergebnis gek�rzt (durch Division von Z�hler und
// Nenner mit nGGT). Innerhalb der Funktion wird mit dem Datentyp BigInt
-// gerechnet, um einen Moeglichen Ueberlauf erkennen zu koennen. Bei
-// einem Ueberlauf wird das Ergebnis auf den Wert ungueltig gesetzt.
+// gerechnet, um einen m�glichen �berlauf erkennen zu k�nnen. Bei
+// einem �berlauf wird das Ergebnis auf den Wert ung�ltig gesetzt.
Fraction& Fraction::operator -= ( const Fraction& rVal )
{
- if ( !rVal.IsValid() )
- {
- nNumerator = 0;
- nDenominator = -1;
- }
- if ( !IsValid() )
- return *this;
-
- // (a/b) - (c/d) = ( (a*d) - (c*b) ) / (b*d)
- BigInt nN( nNumerator );
- nN *= BigInt( rVal.nDenominator );
- BigInt nW1Temp( nDenominator );
- nW1Temp *= BigInt( rVal.nNumerator );
- nN -= nW1Temp;
-
- BigInt nD( nDenominator );
- nD *= BigInt( rVal.nDenominator );
-
- Reduce( nN, nD );
-
- if ( nN.bIsBig || nD.bIsBig )
- {
- nNumerator = 0;
- nDenominator = -1;
- }
- else
- {
- nNumerator = (long)nN,
- nDenominator = (long)nD;
- }
-
- return *this;
+ if ( !rVal.IsValid() )
+ {
+ nNumerator = 0;
+ nDenominator = -1;
+ }
+ if ( !IsValid() )
+ return *this;
+
+ // (a/b) - (c/d) = ( (a*d) - (c*b) ) / (b*d)
+ BigInt nN( nNumerator );
+ nN *= BigInt( rVal.nDenominator );
+ BigInt nW1Temp( nDenominator );
+ nW1Temp *= BigInt( rVal.nNumerator );
+ nN -= nW1Temp;
+
+ BigInt nD( nDenominator );
+ nD *= BigInt( rVal.nDenominator );
+
+ Reduce( nN, nD );
+
+ if ( nN.bIsBig || nD.bIsBig )
+ {
+ nNumerator = 0;
+ nDenominator = -1;
+ }
+ else
+ {
+ nNumerator = (long)nN,
+ nDenominator = (long)nD;
+ }
+
+ return *this;
}
/*************************************************************************
@@ -380,50 +378,50 @@ Fraction& Fraction::operator -= ( const Fraction& rVal )
|*
|* Beschreibung FRACT.SDW
|* Ersterstellung DV 20.09.90
-|* Letzte Aenderung TH 19.08.92
+|* Letzte �nderung TH 19.08.92
|*
*************************************************************************/
-// Zunaechst werden die beiden Parameter auf ihre Gueltigkeit ueberprueft.
-// Ist einer der Parameter ungueltig, dann ist auch des Ergebnis
-// ungueltig. Zur Multiplikation werden jeweils die beiden Zaehler und
-// Nenner miteinander multipliziert. Um Ueberlaufe zu vermeiden, werden
-// vorher jeweils der GGT zwischen dem Zaehler des einen und dem Nenner
-// des anderen Bruches bestimmt und bei der Multiplikation Zaehler und
+// Zun�chst werden die beiden Parameter auf ihre G�ltigkeit �berpr�ft.
+// Ist einer der Parameter ung�ltig, dann ist auch des Ergebnis
+// ung�ltig. Zur Multiplikation werden jeweils die beiden Z�hler und
+// Nenner miteinander multipliziert. Um �berl�ufe zu vermeiden, werden
+// vorher jeweils der GGT zwischen dem Z�hler des einen und dem Nenner
+// des anderen Bruches bestimmt und bei der Multiplikation Z�hler und
// Nenner durch die entsprechenden Werte geteilt.
// Innerhalb der Funktion wird mit dem Datentyp BigInt gerechnet, um
-// einen Moeglichen Ueberlauf erkennen zu koennen. Bei einem Ueberlauf
-// wird das Ergebnis auf den Wert ungueltig gesetzt.
+// einen m�glichen �berlauf erkennen zu k�nnen. Bei einem �berlauf
+// wird das Ergebnis auf den Wert ung�ltig gesetzt.
Fraction& Fraction::operator *= ( const Fraction& rVal )
{
- if ( !rVal.IsValid() )
- {
- nNumerator = 0;
- nDenominator = -1;
- }
- if ( !IsValid() )
- return *this;
-
- long nGGT1 = GetGGT( nNumerator, rVal.nDenominator );
- long nGGT2 = GetGGT( rVal.nNumerator, nDenominator );
- BigInt nN( nNumerator / nGGT1 );
- nN *= BigInt( rVal.nNumerator / nGGT2 );
- BigInt nD( nDenominator / nGGT2 );
- nD *= BigInt( rVal.nDenominator / nGGT1 );
-
- if ( nN.bIsBig || nD.bIsBig )
- {
- nNumerator = 0;
- nDenominator = -1;
- }
- else
- {
- nNumerator = (long)nN,
- nDenominator = (long)nD;
- }
-
- return *this;
+ if ( !rVal.IsValid() )
+ {
+ nNumerator = 0;
+ nDenominator = -1;
+ }
+ if ( !IsValid() )
+ return *this;
+
+ long nGGT1 = GetGGT( nNumerator, rVal.nDenominator );
+ long nGGT2 = GetGGT( rVal.nNumerator, nDenominator );
+ BigInt nN( nNumerator / nGGT1 );
+ nN *= BigInt( rVal.nNumerator / nGGT2 );
+ BigInt nD( nDenominator / nGGT2 );
+ nD *= BigInt( rVal.nDenominator / nGGT1 );
+
+ if ( nN.bIsBig || nD.bIsBig )
+ {
+ nNumerator = 0;
+ nDenominator = -1;
+ }
+ else
+ {
+ nNumerator = (long)nN,
+ nDenominator = (long)nD;
+ }
+
+ return *this;
}
/*************************************************************************
@@ -432,58 +430,58 @@ Fraction& Fraction::operator *= ( const Fraction& rVal )
|*
|* Beschreibung FRACT.SDW
|* Ersterstellung DV 20.09.90
-|* Letzte Aenderung DV 21.12.92
+|* Letzte �nderung DV 21.12.92
|*
*************************************************************************/
-// Zunaechst werden die beiden Parameter auf ihre Gueltigkeit ueberprueft.
-// Ist einer der Parameter ungueltig, dann ist auch des Ergebnis
-// ungueltig.
+// Zun�chst werden die beiden Parameter auf ihre G�ltigkeit �berpr�ft.
+// Ist einer der Parameter ung�ltig, dann ist auch des Ergebnis
+// ung�ltig.
// Um den Bruch a durch b zu teilen, wird a mit dem Kehrwert von b
-// multipliziert. Analog zu Multiplikation wird jezt jeweils der Zaehler
+// multipliziert. Analog zu Multiplikation wird jetzt jeweils der Z�hler
// des einen Bruches mit dem Nenner des anderen multipliziert.
-// Um Ueberlaufe zu vermeiden, werden vorher jeweils der GGT zwischen den
-// beiden Zaehlern und den beiden Nennern bestimmt und bei der
-// Multiplikation Zaehler und Nenner durch die entsprechenden Werte
+// Um �berl�ufe zu vermeiden, werden vorher jeweils der GGT zwischen den
+// beiden Z�hlern und den beiden Nennern bestimmt und bei der
+// Multiplikation Z�hler und Nenner durch die entsprechenden Werte
// geteilt.
// Innerhalb der Funktion wird mit dem Datentyp BigInt gerechnet, um
-// einen Moeglichen Ueberlauf erkennen zu koennen. Bei einem Ueberlauf
-// wird das Ergebnis auf den Wert ungueltig gesetzt.
+// einen m�glichen �berlauf erkennen zu k�nnen. Bei einem �berlauf
+// wird das Ergebnis auf den Wert ung�ltig gesetzt.
Fraction& Fraction::operator /= ( const Fraction& rVal )
{
- if ( !rVal.IsValid() )
- {
- nNumerator = 0;
- nDenominator = -1;
- }
- if ( !IsValid() )
- return *this;
-
- long nGGT1 = GetGGT( nNumerator, rVal.nNumerator );
- long nGGT2 = GetGGT( rVal.nDenominator, nDenominator );
- BigInt nN( nNumerator / nGGT1 );
- nN *= BigInt( rVal.nDenominator / nGGT2 );
- BigInt nD( nDenominator / nGGT2 );
- nD *= BigInt( rVal.nNumerator / nGGT1 );
-
- if ( nN.bIsBig || nD.bIsBig )
- {
- nNumerator = 0;
- nDenominator = -1;
- }
- else
- {
- nNumerator = (long)nN,
- nDenominator = (long)nD;
- if ( nDenominator < 0 )
- {
- nDenominator = -nDenominator;
- nNumerator = -nNumerator;
- }
- }
-
- return *this;
+ if ( !rVal.IsValid() )
+ {
+ nNumerator = 0;
+ nDenominator = -1;
+ }
+ if ( !IsValid() )
+ return *this;
+
+ long nGGT1 = GetGGT( nNumerator, rVal.nNumerator );
+ long nGGT2 = GetGGT( rVal.nDenominator, nDenominator );
+ BigInt nN( nNumerator / nGGT1 );
+ nN *= BigInt( rVal.nDenominator / nGGT2 );
+ BigInt nD( nDenominator / nGGT2 );
+ nD *= BigInt( rVal.nNumerator / nGGT1 );
+
+ if ( nN.bIsBig || nD.bIsBig )
+ {
+ nNumerator = 0;
+ nDenominator = -1;
+ }
+ else
+ {
+ nNumerator = (long)nN,
+ nDenominator = (long)nD;
+ if ( nDenominator < 0 )
+ {
+ nDenominator = -nDenominator;
+ nNumerator = -nNumerator;
+ }
+ }
+
+ return *this;
}
/*************************************************************************
@@ -492,7 +490,7 @@ Fraction& Fraction::operator /= ( const Fraction& rVal )
|*
|* Beschreibung FRACT.SDW
|* Ersterstellung JOE 17.09.95
-|* Letzte Aenderung kendy 2007-06-13
+|* Letzte �nderung kendy 2007-06-13
|*
*************************************************************************/
@@ -500,65 +498,65 @@ Fraction& Fraction::operator /= ( const Fraction& rVal )
// Similar to clz_table that can be googled
const char nbits_table[32] =
{
- 32, 1, 23, 2, 29, 24, 14, 3,
- 30, 27, 25, 18, 20, 15, 10, 4,
- 31, 22, 28, 13, 26, 17, 19, 9,
- 21, 12, 16, 8, 11, 7, 6, 5
+ 32, 1, 23, 2, 29, 24, 14, 3,
+ 30, 27, 25, 18, 20, 15, 10, 4,
+ 31, 22, 28, 13, 26, 17, 19, 9,
+ 21, 12, 16, 8, 11, 7, 6, 5
};
static int impl_NumberOfBits( unsigned long nNum )
{
- // http://en.wikipedia.org/wiki/De_Bruijn_sequence
- //
- // background paper: Using de Bruijn Sequences to Index a 1 in a
- // Computer Word (1998) Charles E. Leiserson,
- // Harald Prokop, Keith H. Randall
- // (e.g. http://citeseer.ist.psu.edu/leiserson98using.html)
- const sal_uInt32 nDeBruijn = 0x7DCD629;
-
- if ( nNum == 0 )
- return 0;
-
- // Get it to form like 0000001111111111b
- nNum |= ( nNum >> 1 );
- nNum |= ( nNum >> 2 );
- nNum |= ( nNum >> 4 );
- nNum |= ( nNum >> 8 );
- nNum |= ( nNum >> 16 );
-
- sal_uInt32 nNumber;
- int nBonus = 0;
+ // https://en.wikipedia.org/wiki/De_Bruijn_sequence
+ //
+ // background paper: Using de Bruijn Sequences to Index a 1 in a
+ // Computer Word (1998) Charles E. Leiserson,
+ // Harald Prokop, Keith H. Randall
+ // (e.g. http://citeseer.ist.psu.edu/leiserson98using.html)
+ const sal_uInt32 nDeBruijn = 0x7DCD629;
+
+ if ( nNum == 0 )
+ return 0;
+
+ // Get it to form like 0000001111111111b
+ nNum |= ( nNum >> 1 );
+ nNum |= ( nNum >> 2 );
+ nNum |= ( nNum >> 4 );
+ nNum |= ( nNum >> 8 );
+ nNum |= ( nNum >> 16 );
+
+ sal_uInt32 nNumber;
+ int nBonus = 0;
#if SAL_TYPES_SIZEOFLONG == 4
- nNumber = nNum;
+ nNumber = nNum;
#elif SAL_TYPES_SIZEOFLONG == 8
- nNum |= ( nNum >> 32 );
-
- if ( nNum & 0x80000000 )
- {
- nNumber = sal_uInt32( nNum >> 32 );
- nBonus = 32;
-
- if ( nNumber == 0 )
- return 32;
- }
- else
- nNumber = sal_uInt32( nNum & 0xFFFFFFFF );
+ nNum |= ( nNum >> 32 );
+
+ if ( nNum & 0x80000000 )
+ {
+ nNumber = sal_uInt32( nNum >> 32 );
+ nBonus = 32;
+
+ if ( nNumber == 0 )
+ return 32;
+ }
+ else
+ nNumber = sal_uInt32( nNum & 0xFFFFFFFF );
#else
#error "Unknown size of long!"
#endif
- // De facto shift left of nDeBruijn using multiplication (nNumber
- // is all ones from topmost bit, thus nDeBruijn + (nDeBruijn *
- // nNumber) => nDeBruijn * (nNumber+1) clears all those bits to
- // zero, sets the next bit to one, and thus effectively shift-left
- // nDeBruijn by lg2(nNumber+1). This generates a distinct 5bit
- // sequence in the msb for each distinct position of the last
- // leading 0 bit - that's the property of a de Bruijn number.
- nNumber = nDeBruijn + ( nDeBruijn * nNumber );
-
- // 5-bit window indexes the result
- return ( nbits_table[nNumber >> 27] ) + nBonus;
+ // De facto shift left of nDeBruijn using multiplication (nNumber
+ // is all ones from topmost bit, thus nDeBruijn + (nDeBruijn *
+ // nNumber) => nDeBruijn * (nNumber+1) clears all those bits to
+ // zero, sets the next bit to one, and thus effectively shift-left
+ // nDeBruijn by lg2(nNumber+1). This generates a distinct 5bit
+ // sequence in the msb for each distinct position of the last
+ // leading 0 bit - that's the property of a de Bruijn number.
+ nNumber = nDeBruijn + ( nDeBruijn * nNumber );
+
+ // 5-bit window indexes the result
+ return ( nbits_table[nNumber >> 27] ) + nBonus;
}
/** Inaccurate cancellation for a fraction.
@@ -581,43 +579,43 @@ static int impl_NumberOfBits( unsigned long nNum )
*/
void Fraction::ReduceInaccurate( unsigned nSignificantBits )
{
- if ( !nNumerator || !nDenominator )
- return;
-
- // Count with unsigned longs only
- const bool bNeg = ( nNumerator < 0 );
- unsigned long nMul = (unsigned long)( bNeg? -nNumerator: nNumerator );
- unsigned long nDiv = (unsigned long)( nDenominator );
-
- DBG_ASSERT(nSignificantBits<65, "More than 64 bit of significance is
overkill!");
-
- // How much bits can we lose?
- const int nMulBitsToLose = Max( ( impl_NumberOfBits( nMul ) - int(
nSignificantBits ) ), 0 );
- const int nDivBitsToLose = Max( ( impl_NumberOfBits( nDiv ) - int(
nSignificantBits ) ), 0 );
-
- const int nToLose = Min( nMulBitsToLose, nDivBitsToLose );
-
- // Remove the bits
- nMul >>= nToLose;
- nDiv >>= nToLose;
-
- if ( !nMul || !nDiv )
- {
- // Return without reduction
- DBG_ERROR( "Oops, we reduced too much..." );
- return;
- }
-
- // Reduce
- long n1 = GetGGT( nMul, nDiv );
- if ( n1 != 1 )
- {
- nMul /= n1;
- nDiv /= n1;
- }
-
- nNumerator = bNeg? -long( nMul ): long( nMul );
- nDenominator = nDiv;
+ if ( !nNumerator || !nDenominator )
+ return;
+
+ // Count with unsigned longs only
+ const bool bNeg = ( nNumerator < 0 );
+ unsigned long nMul = (unsigned long)( bNeg? -nNumerator: nNumerator );
+ unsigned long nDiv = (unsigned long)( nDenominator );
+
+ DBG_ASSERT(nSignificantBits<65, "More than 64 bit of significance is
overkill!");
+
+ // How much bits can we lose?
+ const int nMulBitsToLose = Max( ( impl_NumberOfBits( nMul ) - int(
nSignificantBits ) ), 0 );
+ const int nDivBitsToLose = Max( ( impl_NumberOfBits( nDiv ) - int(
nSignificantBits ) ), 0 );
+
+ const int nToLose = Min( nMulBitsToLose, nDivBitsToLose );
+
+ // Remove the bits
+ nMul >>= nToLose;
+ nDiv >>= nToLose;
+
+ if ( !nMul || !nDiv )
+ {
+ // Return without reduction
+ DBG_ERROR( "Oops, we reduced too much..." );
+ return;
+ }
+
+ // Reduce
+ long n1 = GetGGT( nMul, nDiv );
+ if ( n1 != 1 )
+ {
+ nMul /= n1;
+ nDiv /= n1;
+ }
+
+ nNumerator = bNeg? -long( nMul ): long( nMul );
+ nDenominator = nDiv;
}
/*************************************************************************
@@ -626,17 +624,17 @@ void Fraction::ReduceInaccurate( unsigned
nSignificantBits )
|*
|* Beschreibung FRACT.SDW
|* Ersterstellung DV 20.09.90
-|* Letzte Aenderung TH 19.08.92
+|* Letzte �nderung TH 19.08.92
|*
*************************************************************************/
sal_Bool operator == ( const Fraction& rVal1, const Fraction& rVal2 )
{
- if ( !rVal1.IsValid() || !rVal2.IsValid() )
- return sal_False;
+ if ( !rVal1.IsValid() || !rVal2.IsValid() )
+ return sal_False;
- return rVal1.nNumerator == rVal2.nNumerator
- && rVal1.nDenominator == rVal2.nDenominator;
+ return rVal1.nNumerator == rVal2.nNumerator
+ && rVal1.nDenominator == rVal2.nDenominator;
}
/*************************************************************************
@@ -645,28 +643,28 @@ sal_Bool operator == ( const Fraction& rVal1, const
Fraction& rVal2 )
|*
|* Beschreibung FRACT.SDW
|* Ersterstellung DV 20.09.90
-|* Letzte Aenderung DV 21.12.92
+|* Letzte �nderung DV 21.12.92
|*
*************************************************************************/
-// Beide Operanden werden zunaechst auf ihre Gueltigkeit ueberprueft und
-// anschliessend zur Sicherheit noch einmal gekuerzt. Um die Brueche
-// (a/b) und (c/d) zu vergleichen, werden sie zunaechst auf einen
-// gemeinsamen Nenner gebracht (b*d), um dann die beiden Zaehler (a*d)
+// Beide Operanden werden zun�chst auf ihre G�ltigkeit �berpr�ft und
+// anschlie�end zur Sicherheit noch einmal gek�rzt. Um die Br�che
+// (a/b) und (c/d) zu vergleichen, werden sie zun�chst auf einen
+// gemeinsamen Nenner gebracht (b*d), um dann die beiden Z�hler (a*d)
// und (c*b) zu vergleichen. Das Ergebnis dieses Vergleichs wird
-// zurueckgegeben.
+// zur�ckgegeben.
sal_Bool operator < ( const Fraction& rVal1, const Fraction& rVal2 )
{
- if ( !rVal1.IsValid() || !rVal2.IsValid() )
- return sal_False;
+ if ( !rVal1.IsValid() || !rVal2.IsValid() )
+ return sal_False;
- BigInt nN( rVal1.nNumerator );
- nN *= BigInt( rVal2.nDenominator );
- BigInt nD( rVal1.nDenominator );
- nD *= BigInt( rVal2.nNumerator );
+ BigInt nN( rVal1.nNumerator );
+ nN *= BigInt( rVal2.nDenominator );
+ BigInt nD( rVal1.nDenominator );
+ nD *= BigInt( rVal2.nNumerator );
- return nN < nD;
+ return nN < nD;
}
/*************************************************************************
@@ -675,28 +673,28 @@ sal_Bool operator < ( const Fraction& rVal1, const
Fraction& rVal2 )
|*
|* Beschreibung FRACT.SDW
|* Ersterstellung DV 20.09.90
-|* Letzte Aenderung TH 19.08.92
+|* Letzte �nderung TH 19.08.92
|*
*************************************************************************/
-// Beide Operanden werden zunaechst auf ihre Gueltigkeit ueberprueft und
-// anschliessend zur Sicherheit noch einmal gekuerzt. Um die Brueche
-// (a/b) und (c/d) zu vergleichen, werden sie zunaechst auf einen
-// gemeinsamen Nenner gebracht (b*d), um dann die beiden Zaehler (a*d)
+// Beide Operanden werden zun�chst auf ihre G�ltigkeit �berpr�ft und
+// anschlie�end zur Sicherheit noch einmal gek�rzt. Um die Br�che
+// (a/b) und (c/d) zu vergleichen, werden sie zun�chst auf einen
+// gemeinsamen Nenner gebracht (b*d), um dann die beiden Z�hler (a*d)
// und (c*b) zu vergleichen. Das Ergebnis dieses Vergleichs wird
-// zurueckgegeben.
+// zur�ckgegeben.
sal_Bool operator > ( const Fraction& rVal1, const Fraction& rVal2 )
{
- if ( !rVal1.IsValid() || !rVal2.IsValid() )
- return sal_False;
+ if ( !rVal1.IsValid() || !rVal2.IsValid() )
+ return sal_False;
- BigInt nN( rVal1.nNumerator );
- nN *= BigInt( rVal2.nDenominator );
- BigInt nD( rVal1.nDenominator);
- nD *= BigInt( rVal2.nNumerator );
+ BigInt nN( rVal1.nNumerator );
+ nN *= BigInt( rVal2.nDenominator );
+ BigInt nD( rVal1.nDenominator);
+ nD *= BigInt( rVal2.nNumerator );
- return nN > nD;
+ return nN > nD;
}
/*************************************************************************
@@ -705,7 +703,7 @@ sal_Bool operator > ( const Fraction& rVal1, const
Fraction& rVal2 )
|*
|* Beschreibung FRACT.SDW
|* Ersterstellung MM 08.01.96
-|* Letzte Aenderung MM 08.01.96
+|* Letzte �nderung MM 08.01.96
|*
*************************************************************************/
SvStream& operator >> ( SvStream& rIStream, Fraction& rFract )
@@ -721,7 +719,7 @@ SvStream& operator >> ( SvStream& rIStream, Fraction&
rFract )
|*
|* Beschreibung FRACT.SDW
|* Ersterstellung MM 08.01.96
-|* Letzte Aenderung MM 08.01.96
+|* Letzte �nderung MM 08.01.96
|*
*************************************************************************/
SvStream& operator << ( SvStream& rOStream, const Fraction& rFract )
@@ -730,3 +728,5 @@ SvStream& operator << ( SvStream& rOStream, const Fraction&
rFract )
rOStream << rFract.nDenominator;
return rOStream;
}
+
+/* vim: set noet sw=4 ts=4: */