0 people like it.
Like the snippet!
Convert a Float to a Mixed Number
Function to Convert a float to a mixed number.
My thanks to John Kennedy of Santa Monica College for his "Algorithm to Convert a Decimal to a Fraction"
(see link).
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
|
let ToMixedNumber(x : float) =
let wholePart = int x // whole part of x
let decimalPt = x % 1.0 // decimal part of x
let rec cF(Z : float, i : int, Dm : float, Do : float) =
match Z % 1.0 > 1e-6, i < 1 with
// First case terminates after 14 iterations
| _ , true -> (wholePart, (int (System.Math.Round(decimalPt * Do)), int Do))
// Second case executes next cF (continuing fraction)
| true , false -> cF(1.0/(Z % 1.0), i - 1 , Do, Do * System.Math.Round(1.0/(Z % 1.0)-0.5) + Dm )
// Final case terminates if the remainder of Z > 10^-6
| false, _ -> (wholePart, (int (System.Math.Round(decimalPt * Do)), int Do))
decimalPt
|> fun x -> cF(x, 14, 0.0, 1.0)
// Test using pi as input
let dummyrecA = ToMixedNumber System.Math.PI
// Recompose pi as a decimal form.
// NOTE Actual Value of pi = 3.1415926535897932384626433833M
let myPiA = decimal (fst dummyrecA) + decimal ( fst (snd dummyrecA)) / decimal ( snd (snd dummyrecA))
|
val ToMixedNumber : x:float -> int * (int * int)
Full name: Script.ToMixedNumber
val x : float
Multiple items
val float : value:'T -> float (requires member op_Explicit)
Full name: Microsoft.FSharp.Core.Operators.float
--------------------
type float = System.Double
Full name: Microsoft.FSharp.Core.float
--------------------
type float<'Measure> = float
Full name: Microsoft.FSharp.Core.float<_>
val wholePart : int
Multiple items
val int : value:'T -> int (requires member op_Explicit)
Full name: Microsoft.FSharp.Core.Operators.int
--------------------
type int = int32
Full name: Microsoft.FSharp.Core.int
--------------------
type int<'Measure> = int
Full name: Microsoft.FSharp.Core.int<_>
val decimalPt : float
val cF : (float * int * float * float -> int * (int * int))
val Z : float
val i : int
val Dm : float
val Do : float
namespace System
type Math =
static val PI : float
static val E : float
static member Abs : value:sbyte -> sbyte + 6 overloads
static member Acos : d:float -> float
static member Asin : d:float -> float
static member Atan : d:float -> float
static member Atan2 : y:float * x:float -> float
static member BigMul : a:int * b:int -> int64
static member Ceiling : d:decimal -> decimal + 1 overload
static member Cos : d:float -> float
...
Full name: System.Math
System.Math.Round(d: decimal) : decimal
System.Math.Round(a: float) : float
System.Math.Round(d: decimal, mode: System.MidpointRounding) : decimal
System.Math.Round(d: decimal, decimals: int) : decimal
System.Math.Round(value: float, mode: System.MidpointRounding) : float
System.Math.Round(value: float, digits: int) : float
System.Math.Round(d: decimal, decimals: int, mode: System.MidpointRounding) : decimal
System.Math.Round(value: float, digits: int, mode: System.MidpointRounding) : float
val dummyrecA : int * (int * int)
Full name: Script.dummyrecA
field System.Math.PI = 3.14159265359
val myPiA : decimal
Full name: Script.myPiA
Multiple items
val decimal : value:'T -> decimal (requires member op_Explicit)
Full name: Microsoft.FSharp.Core.Operators.decimal
--------------------
type decimal = System.Decimal
Full name: Microsoft.FSharp.Core.decimal
--------------------
type decimal<'Measure> = decimal
Full name: Microsoft.FSharp.Core.decimal<_>
val fst : tuple:('T1 * 'T2) -> 'T1
Full name: Microsoft.FSharp.Core.Operators.fst
val snd : tuple:('T1 * 'T2) -> 'T2
Full name: Microsoft.FSharp.Core.Operators.snd
More information