Code: Select all
#ifdef __FB_WIN32__
#ifdef __FB_64BIT__
'64-bit
Type ext_real
As Ulongint hi, lo
end type
Sub sprint_ Naked Cdecl(Byval buf As Zstring Ptr, Byval frmt As Zstring Ptr, Byref x As ext_real)
Asm
Sub rsp, 56
fld tbyte Ptr [r8]
fstp tbyte Ptr [rsp+32]
lea r8,[rsp+32]
Call __mingw_sprintf
nop
Add rsp, 56
ret
End Asm
End Sub
Sub sscan_ Naked Cdecl(Byref x As ext_real, Byval buf As Zstring Ptr, Byval frmt As Zstring Ptr)
Asm
mov r9, rcx
Xor eax, eax
mov rcx, rdx
mov rdx, r8
mov r8, r9
jmp __mingw_sscanf
End Asm
End Sub
#else
'32-bit
Type ext_real
As Ulong ldfp(0 To 2)
end type
Sub sprint_ Naked Cdecl(Byval buf As Zstring Ptr, Byval frmt As Zstring Ptr, Byref x As ext_real)
Asm
Sub esp, 24
mov eax, dword Ptr [esp+36]
Push dword Ptr [eax+8]
Push dword Ptr [eax+4]
Push dword Ptr [eax]
Push dword Ptr [esp+44]
Push dword Ptr [esp+44]
Call ___mingw_sprintf
Add esp, 44
ret
End Asm
End Sub
Sub sscan_ Naked Cdecl(Byref x As ext_real, Byval buf As Zstring Ptr, Byval frmt As Zstring Ptr)
Asm
mov eax, dword Ptr [esp+8]
mov edx, dword Ptr [esp+12]
mov ecx, dword Ptr [esp+4]
mov dword Ptr [esp+8], edx
mov dword Ptr [esp+12], ecx
mov dword Ptr [esp+4], eax
'jmp __isoc99_sscanf
jmp ___mingw_sscanf
End Asm
End Sub
#endif
#endif
Function ldbl_val(Byref s As String) As ext_real
Dim As ext_real ret
Dim As String frmt = "%Lf"
sscan_(ret, s, frmt)
Function = ret
End Function
Function ldbl_str(Byref y As ext_real, Byval prec As Long = 19, Byref f As String="g") As String
Dim As Zstring Ptr buf=Callocate(256)
Dim As Zstring Ptr frmt=Callocate(16)
*frmt= "%."+Trim(Str(prec))+"L"
If Lcase(f)="e" Or Lcase(f)="f" Or Lcase(f)="a" Then
*frmt=*frmt+f
Else
*frmt=*frmt+"g"
End If
Dim As String ret
sprint_ (buf, frmt, y)
ret=*buf
If Left(ret,1)<>"-" Then
ret=" "+ret
End If
Deallocate(buf)
Deallocate(frmt)
Function = ret
End Function
dim as ext_real x
dim as string e, s="2.718281828459045235360287"
x=ldbl_val(s)
print "extended float to string using defaults ";ldbl_str(x)
print "extended float to string, 10 digits ";ldbl_str(x, 10)
print "extended float to string, 12 decimals f notation ";ldbl_str(x, 12, "f")
print "extended float to string, 14 decimals e notation ";ldbl_str(x, 14, "e")
print "extended float to string, 16 digits g notation ";ldbl_str(x, 16, "g")
print "extended float to string, 15 heximals a notation ";ldbl_str(x, 15, "A")
print "e=""0XA.DF85458A2BB4A9BP-2""" : e="0XA.DF85458A2BB4A9BP-2"
print "x=ldbl_val(e)" : x=ldbl_val(e)
print "print ldbl_str(x) -->";ldbl_str(x)
Code: Select all
extended float to string using defaults 2.718281828459045235
extended float to string, 10 digits 2.718281828
extended float to string, 12 decimals f notation 2.718281828459
extended float to string, 14 decimals e notation 2.71828182845905e+00
extended float to string, 16 digits g notation 2.718281828459045
extended float to string, 15 heximals a notation 0XA.DF85458A2BB4A9BP-2
e="0XA.DF85458A2BB4A9BP-2"
x=ldbl_val(e)
print ldbl_str(x) --> 2.718281828459045235