Posts: 2,180
Threads: 222
Joined: Apr 2022
Reputation:
104
So working with repetends and converting them to fractions we have...
.333... = 1/3
.666... = 2/3
and now drum roll, please...
.999... = 1
Pete
Posts: 422
Threads: 27
Joined: Apr 2022
Reputation:
26
08-12-2022, 11:01 AM
(This post was last modified: 08-12-2022, 12:47 PM by Jack.)
hi Pete
I would do something like the following
Code: (Select All) Dim As Double x, ip, fp, eps
Dim As _Integer64 n, n0, n1, d, d0, d1
Dim As Long sign
x = .33333333333333333333
x = 3.1415926535897932
eps = 1E-13
n0 = 0
n1 = 1
d0 = 1
d1 = 0
sign = Sgn(x)
x = Abs(x)
ip = Fix(x)
fp = x - ip 'fp=frac(x)
n = ip * n1 + n0
d = ip * d1 + d0
n0 = n1: n1 = n
d0 = d1: d1 = d
While (fp > eps) And n < 1000000000 And d < 1000000000
'Print n; "/"; d
x = 1 / fp
ip = Fix(x)
fp = x - ip 'fp=frac(x)
n = ip * n1 + n0
d = ip * d1 + d0
n0 = n1: n1 = n
d0 = d1: d1 = d
Wend
If sign < 0 Then n = -n
Print n; "/"; d
the code converts a given decimal to continued fraction convergents but in this example only the last convergents are printed
Posts: 301
Threads: 16
Joined: Apr 2022
Reputation:
51
This is such low hanging fruit, like the age-old 0.1+0.2=0.300000000003 or whatever, but I will give a +1 to the first clean, conclusive, & dignified response to this nonsense
Posts: 422
Threads: 27
Joined: Apr 2022
Reputation:
26
08-12-2022, 03:05 PM
(This post was last modified: 08-12-2022, 03:09 PM by Jack.)
are you talking to me vince?
I like to see your solution
Posts: 64
Threads: 12
Joined: Apr 2022
Reputation:
5
(08-12-2022, 02:44 PM)vince Wrote: This is such low hanging fruit, like the age-old 0.1+0.2=0.300000000003 or whatever, but I will give a +1 to the first clean, conclusive, & dignified response to this nonsense
I agree (.. nonsense).
So many internet bytes have been wasted on .99999.. = 1; reminds me of the excessive threads regarding the Monty Hall "problem". Although the Monty Hall problem is worth the time to get the not-too-difficult "solution", which is not immediately obvious.
___________________________________________________________________________________
I am mostly grateful for the people who came before me. Will the people after me be grateful for me?
Posts: 422
Threads: 27
Joined: Apr 2022
Reputation:
26
all talk and no code, why don't you show us a dignified answer?
Posts: 2,698
Threads: 327
Joined: Apr 2022
Reputation:
217
Honestly, I don't see why this is a head scratcher at all. @Pete is converting the decimal to a fraction here..
.33... = 1/3
.66... = 2/3
.99... = 3/3
All good and well, and then in the last case his faction just simplifies to 1.
I'd imagine the code is written to simplify fractions, at least? Otherwise, why don't we see 0.33 = 2/6 or 100/300, or some such? I suppose it might could give an answer of 1/1, but I imagine there's something in Pete's code that just turns it into an integer, when the divisor is 1, just like it'd probably toss an error with a divisor of 2.
Not too much of a head scratcher to think that 3/3 = 1. At least, not to my way of thinking, it's not.
Posts: 3,980
Threads: 177
Joined: Apr 2022
Reputation:
220
08-12-2022, 04:17 PM
(This post was last modified: 08-12-2022, 04:21 PM by bplus.)
I'm tell'n ya! Decide the decimal precision you desire then round by that. Here is 4 decimals to right of point.
Code: (Select All) For i## = 1 To 3
Print Round2$(i## / 3, -4)
Next
Function N2S$ (EXP$) 'remove scientific Notation to String (~40 LOC)
'SMcNeill Jan 7, 2020 ref: https://www.qb64.org/forum/index.php?topic=1555.msg112989#msg112989
'Last Function in code marked Best Answer (removed debug comments and blank lines added these 2 lines.)
ReDim t$, sign$, l$, r$, r&&
ReDim dp As Long, dm As Long, ep As Long, em As Long, check1 As Long, l As Long, i As Long
t$ = LTrim$(RTrim$(EXP$))
If Left$(t$, 1) = "-" Or Left$(t$, 1) = "N" Then sign$ = "-": t$ = Mid$(t$, 2)
dp = InStr(t$, "D+"): dm = InStr(t$, "D-")
ep = InStr(t$, "E+"): em = InStr(t$, "E-")
check1 = Sgn(dp) + Sgn(dm) + Sgn(ep) + Sgn(em)
If check1 < 1 Or check1 > 1 Then N2S = _Trim$(EXP$): Exit Function 'If no scientic notation is found, or if we find more than 1 type, it's not SN!
Select Case l 'l now tells us where the SN starts at.
Case Is < dp: l = dp
Case Is < dm: l = dm
Case Is < ep: l = ep
Case Is < em: l = em
End Select
l$ = Left$(t$, l - 1) 'The left of the SN
r$ = Mid$(t$, l + 1): r&& = Val(r$) 'The right of the SN, turned into a workable long
If InStr(l$, ".") Then 'Location of the decimal, if any
If r&& > 0 Then
r&& = r&& - Len(l$) + 2
Else
r&& = r&& + 1
End If
l$ = Left$(l$, 1) + Mid$(l$, 3)
End If
Select Case r&&
Case 0 'what the heck? We solved it already?
'l$ = l$
Case Is < 0
For i = 1 To -r&&
l$ = "0" + l$
Next
l$ = "." + l$
Case Else
For i = 1 To r&&
l$ = l$ + "0"
Next
l$ = l$
End Select
N2S$ = sign$ + l$
End Function
Function Round2$ (anyNumber As _Float, dp As Long) ' uses N2S$
' 5 and up at decimal place dp+1 > +1 at decimal place 4 and down > +0 at dp
'2 1 0.-1 -2 -3 -4 ... pick dp like this for this Round$ Function
Dim sn$, dot, predot, postdot, rtn$
sn$ = N2S$(Str$(anyNumber + .5 * 10 ^ dp)) 'get rid of sci notation, steve trims it so next find dot
dot = InStr(sn$, ".")
If dot Then
predot = dot - 1
postdot = Len(sn$) - (dot + 1)
Else
predot = Len(sn$)
postdot = 0
End If
' xxx.yyyyyy dp = -2
' ^ dp
If dp >= 0 Then
rtn$ = Mid$(sn$, 1, predot - dp) + String$(dp, "0")
Else
rtn$ = Mid$(sn$, 1, predot) + "." + Mid$(sn$, dot + 1, -dp)
End If
If rtn$ = "" Then Round2$ = "0" Else Round2$ = rtn$
End Function
About to be added to b+ GUI BM so that the Slider labels don't start showing this crap:
3.4100000000001
when supposed to be using the int(x * 100)/100 trick that fails on certain numbers
3.41
b = b + ...
Posts: 2,180
Threads: 222
Joined: Apr 2022
Reputation:
104
08-12-2022, 04:26 PM
(This post was last modified: 08-12-2022, 04:28 PM by Pete.)
Edit: Guys, this post doesn't have anything to do with my algorithm, It works. It's just an observation of a weird special circumstance of mathematics.
Point being that in decimal to fraction conversion and back is not reversible in this special instance.
.9... = 1 /1 but 1/1 = 1, not .9...
So mathematically is .9... = 1? Really?
Damn shame when math can't even be perfect.
Pete
Shoot first and shoot people who ask questions, later.
Posts: 3,980
Threads: 177
Joined: Apr 2022
Reputation:
220
Math is perfect, discrete math like that done with computers is not. You only know perfect by way of math.
b = b + ...
|