473,769 Members | 2,599 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

Convert VB Double to Pascal Real

Hi,

I'm writing a program using VB.NET that needs to communicate with a DOS
Pascal program than cannot be modified. The communication channel is through
some file databases, and I have a huge problem writing VB Double values to
the file so as the Pascal program can read them as Pascal Real values.

I've managed to find the algorithm to read the Pascal Real format and
convert it to a VB Double, but I cannot figure out the opposite algorithm.

Can someone help me reverse my algorithm and develop the function
"DoubleToRe al (ByVal Data As Double) As String"

Here is the conversion from real to double:

Public Function RealToDouble(By Val Data As String) As Double
Dim dMantissa As Double
Dim i As Integer
Dim j As Long
Dim k As Long

If Len(Data) <> 6 Then
'Err.Raise
'exception
Exit Function
End If

'accumulate the mantissa
dMantissa = 1
For i = 6 To 2 Step -1
For j = CType(IIf(i = 6, 6, 7), Long) To 0 Step -1
k = k + 1
If (Asc(Mid$(Data, i, 1)) And CType(2 ^ j, Long)) <> 0 Then
dMantissa = dMantissa + 2 ^ -k
End If
Next j
Next i

'finally, assemble all the pieces into a number
If (Asc(Mid$(Data, 6, 1)) And &H80) = &H80 Then
RealToDouble = -dMantissa * 2 ^ (Asc(Mid$(Data, 1, 1)) - 129)
Else
RealToDouble = dMantissa * 2 ^ (Asc(Mid$(Data, 1, 1)) - 129)
End If

Try
Return ([Decimal].Round(CDec(Rea lToDouble), 2))
Catch ex As Exception
'MsgBox("RealTo Double, Conversion error: " & Data & "; " &
RealToDouble.To String, MsgBoxStyle.Cri tical)
Return 0
End Try

End Function

Thanks for your help
David
Nov 20 '05
17 4376
I dont know the answer to this. I suggest you post the following this
specific question at top level in the group:
Regards - OHM

Cor wrote:
But should it do that?

Nov 20 '05 #11
Cor
Hi David,

I think this is a much to dificult approach for a newsgroup.
Maybe if guys like Fergus Cooney where here now, he could help you because
he likes this.

But he is not and I don't know if he will return soon.

Every byte in a file is representent by a hex value.

Can you not represent the bytes in hex form representing a normal decimal
value, maybe somebody can help you than.

Probably not me, because mostly this is not my stuff, but you never know.

Cor
Nov 20 '05 #12
Cor
Hi OHM,

Putted it in the vb.language.con trols group.

Almost the private group from Herfied, I am curious what happens.

:-))

Cor
Nov 20 '05 #13
The exact representation of the Pascal Real type is:
Sign Significand Exponent
Width (bits) 1 39 8

David

"David Scemama" <da***********@ nospam.wanadoo. fr> wrote in message
news:eF******** ******@TK2MSFTN GP12.phx.gbl...
The Pascal Real type, is stored on 6 bytes with a very special coding. When you write a real value in a file, 6 bytes are written to represent the value (obviously, no language writes the string representation of the real !). My function reads the 6 bytes and convert them to a VB double.

I need the reverse function !

David
"One Handed Man" <Bo****@Duck.ne t> wrote in message
news:bp******** **@titan.btinte rnet.com...
I probably have not understood you correctly, but can you not simply

convert
the double to a string an then truncate the string to the correct length?
As far as I am aware, a real number is simply a number which is not
imaginary, so I dont know how this differs in a Pascal Real number. Your
function seems to convert a string into a double but goes a long way

around.
BTW, I actually tried to convert "1.2345" and it returned 0.0

I'm sure Im missing something here, can you illuminate ?

Regards - OHM

David Scemama wrote:
Hi,

I'm writing a program using VB.NET that needs to communicate with a
DOS Pascal program than cannot be modified. The communication channel
is through some file databases, and I have a huge problem writing VB
Double values to the file so as the Pascal program can read them as
Pascal Real values.

I've managed to find the algorithm to read the Pascal Real format and
convert it to a VB Double, but I cannot figure out the opposite
algorithm.

Can someone help me reverse my algorithm and develop the function
"DoubleToRe al (ByVal Data As Double) As String"

Here is the conversion from real to double:

Public Function RealToDouble(By Val Data As String) As Double
Dim dMantissa As Double
Dim i As Integer
Dim j As Long
Dim k As Long

If Len(Data) <> 6 Then
'Err.Raise
'exception
Exit Function
End If

'accumulate the mantissa
dMantissa = 1
For i = 6 To 2 Step -1
For j = CType(IIf(i = 6, 6, 7), Long) To 0 Step -1
k = k + 1
If (Asc(Mid$(Data, i, 1)) And CType(2 ^ j, Long)) <>
0 Then dMantissa = dMantissa + 2 ^ -k
End If
Next j
Next i

'finally, assemble all the pieces into a number
If (Asc(Mid$(Data, 6, 1)) And &H80) = &H80 Then
RealToDouble = -dMantissa * 2 ^ (Asc(Mid$(Data, 1, 1)) -
129) Else
RealToDouble = dMantissa * 2 ^ (Asc(Mid$(Data, 1, 1)) -
129) End If

Try
Return ([Decimal].Round(CDec(Rea lToDouble), 2))
Catch ex As Exception
'MsgBox("RealTo Double, Conversion error: " & Data & "; " &
RealToDouble.To String, MsgBoxStyle.Cri tical)
Return 0
End Try

End Function

Thanks for your help
David



Nov 20 '05 #14
You'll probably get the reply in German !.

Regards - OHM

Cor wrote:
Hi OHM,

Putted it in the vb.language.con trols group.

Almost the private group from Herfied, I am curious what happens.

:-))

Cor

Nov 20 '05 #15
Hay David,

This is clearly a complex conversion. I found this on the internet. It is
Quick Basic rendering of a solution to your problem ( Hopefully ). You will
need to amend it a bit for VB.NET, but hopefully it gives you a template to
work with.

HTH - OHM
DECLARE FUNCTION power# (x!, y AS INTEGER)
DECLARE SUB RealConv (RealCost AS ANY, NewCost#)
' the QBASIC equivalent of the above Pascal struct:
TYPE PASdataRecord
EmpNameLength AS STRING * 1
EmpName AS STRING * 30
Number AS INTEGER
Wage AS STRING * 6
END TYPE
' set up the file to be opened and read from QBASIC
DIM EmployeeDAT AS PASdataRecord
OPEN "EMPLOY.DAT " FOR RANDOM ACCESS READ LOCK WRITE AS #1 LEN =
LEN(EmployeeDAT )
' read the file a record at a time until the end
DO WHILE NOT EOF(1)
CLS
Count = Count + 1
SEEK #1, Count
GET #1, , EmployeeDAT
' strip out the actual string using the first length byte
EmployeeDAT.Emp Name = MID$(EmployeeDA T.EmpName, 1,
ASC(EmployeeDAT .EmpNameLength) )
' the following routine converts the pascal real to Qbasic double
CALL RealConv(Employ eeDAT.Wage, BASwage#)
PRINT "Employee number = "; EmployeeDAT.Num ber
PRINT "Employee EmpName = "; EmployeeDAT.Emp Name
PRINT "Employee wage = "; BASwage
LOOP
FUNCTION power# (x, y AS INTEGER)
' simple x to the power of y function
power# = EXP(y * LOG(x))
END FUNCTION

SUB RealConv (Real$, NewCost#)
' create an array to hold each byte of the real string
DIM RealHold(6)
RealHold(1) = ASC(MID$(Real$, 1, 1))
RealHold(2) = ASC(MID$(Real$, 2, 1))
RealHold(3) = ASC(MID$(Real$, 3, 1))
RealHold(4) = ASC(MID$(Real$, 4, 1))
RealHold(5) = ASC(MID$(Real$, 5, 1))
RealHold(6) = ASC(MID$(Real$, 6, 1))
' if positive contains a number then its negative
positive = &H80 AND RealHold(6)
' clear the Pos/Neg bit from byte 6
RealHold(6) = &H80 OR RealHold(6)
' set up the significand as 1.0
Significand# = 1#
' check each individual bit for on/off; if on then multiply out the
' number (2,4,8,16,32,64 ,128, etc.)
FOR bytecheck = 2 TO 6
' bit 0 of byte
IF (RealHold(bytec heck) AND &H1) = 1 THEN
Significand# = Significand# + power(2, (0 + (bytecheck - 2) * 8))
END IF
' bit 1 of byte
IF (RealHold(bytec heck) AND &H2) = 2 THEN
Significand# = Significand# + power(2, (1 + (bytecheck - 2) * 8))
END IF
' bit 2 of byte
IF (RealHold(bytec heck) AND &H4) = 4 THEN
Significand# = Significand# + power(2, (2 + (bytecheck - 2) * 8))
END IF
' bit 3 of byte
IF (RealHold(bytec heck) AND &H8) = 8 THEN
Significand# = Significand# + power(2, (3 + (bytecheck - 2) * 8))
END IF
' bit 4 of byte
IF (RealHold(bytec heck) AND &H10) = 16 THEN
Significand# = Significand# + power(2, (4 + (bytecheck - 2) * 8))
END IF
' bit 5 of byte
IF (RealHold(bytec heck) AND &H20) = 32 THEN
Significand# = Significand# + power(2, (5 + (bytecheck - 2) * 8))
END IF
' bit 6 of byte
IF (RealHold(bytec heck) AND &H40) = 64 THEN
Significand# = Significand# + power(2, (6 + (bytecheck - 2) * 8))
END IF
' bit 7 of byte
IF (RealHold(bytec heck) AND &H80) = 128 THEN
Significand# = Significand# + power(2, (7 + (bytecheck - 2) * 8))
END IF
NEXT
' normalize the number by dividing calculated number by a number with all
' bits turned on: 2 to the power of 40
Significand# = Significand# / power(2, 40)
' calculate in the exponent
Number# = Significand# * power(2, (RealHold(1) - 128))
' set the pos/neg sign
IF positive > 0 THEN Number# = Number# * -1
NewCost# = Number#
END
Nov 20 '05 #16
Unfortunately, this is the exact contrary of what I would like to do. This
function converts the Pascal Real contained in a string to a double.

Thanks
David

"One Handed Man" <Bo****@Duck.ne t> wrote in message
news:bq******** **@titan.btinte rnet.com...
Hay David,

This is clearly a complex conversion. I found this on the internet. It is
Quick Basic rendering of a solution to your problem ( Hopefully ). You will need to amend it a bit for VB.NET, but hopefully it gives you a template to work with.

HTH - OHM
DECLARE FUNCTION power# (x!, y AS INTEGER)
DECLARE SUB RealConv (RealCost AS ANY, NewCost#)
' the QBASIC equivalent of the above Pascal struct:
TYPE PASdataRecord
EmpNameLength AS STRING * 1
EmpName AS STRING * 30
Number AS INTEGER
Wage AS STRING * 6
END TYPE
' set up the file to be opened and read from QBASIC
DIM EmployeeDAT AS PASdataRecord
OPEN "EMPLOY.DAT " FOR RANDOM ACCESS READ LOCK WRITE AS #1 LEN =
LEN(EmployeeDAT )
' read the file a record at a time until the end
DO WHILE NOT EOF(1)
CLS
Count = Count + 1
SEEK #1, Count
GET #1, , EmployeeDAT
' strip out the actual string using the first length byte
EmployeeDAT.Emp Name = MID$(EmployeeDA T.EmpName, 1,
ASC(EmployeeDAT .EmpNameLength) )
' the following routine converts the pascal real to Qbasic double
CALL RealConv(Employ eeDAT.Wage, BASwage#)
PRINT "Employee number = "; EmployeeDAT.Num ber
PRINT "Employee EmpName = "; EmployeeDAT.Emp Name
PRINT "Employee wage = "; BASwage
LOOP
FUNCTION power# (x, y AS INTEGER)
' simple x to the power of y function
power# = EXP(y * LOG(x))
END FUNCTION

SUB RealConv (Real$, NewCost#)
' create an array to hold each byte of the real string
DIM RealHold(6)
RealHold(1) = ASC(MID$(Real$, 1, 1))
RealHold(2) = ASC(MID$(Real$, 2, 1))
RealHold(3) = ASC(MID$(Real$, 3, 1))
RealHold(4) = ASC(MID$(Real$, 4, 1))
RealHold(5) = ASC(MID$(Real$, 5, 1))
RealHold(6) = ASC(MID$(Real$, 6, 1))
' if positive contains a number then its negative
positive = &H80 AND RealHold(6)
' clear the Pos/Neg bit from byte 6
RealHold(6) = &H80 OR RealHold(6)
' set up the significand as 1.0
Significand# = 1#
' check each individual bit for on/off; if on then multiply out the
' number (2,4,8,16,32,64 ,128, etc.)
FOR bytecheck = 2 TO 6
' bit 0 of byte
IF (RealHold(bytec heck) AND &H1) = 1 THEN
Significand# = Significand# + power(2, (0 + (bytecheck - 2) * 8))
END IF
' bit 1 of byte
IF (RealHold(bytec heck) AND &H2) = 2 THEN
Significand# = Significand# + power(2, (1 + (bytecheck - 2) * 8))
END IF
' bit 2 of byte
IF (RealHold(bytec heck) AND &H4) = 4 THEN
Significand# = Significand# + power(2, (2 + (bytecheck - 2) * 8))
END IF
' bit 3 of byte
IF (RealHold(bytec heck) AND &H8) = 8 THEN
Significand# = Significand# + power(2, (3 + (bytecheck - 2) * 8))
END IF
' bit 4 of byte
IF (RealHold(bytec heck) AND &H10) = 16 THEN
Significand# = Significand# + power(2, (4 + (bytecheck - 2) * 8))
END IF
' bit 5 of byte
IF (RealHold(bytec heck) AND &H20) = 32 THEN
Significand# = Significand# + power(2, (5 + (bytecheck - 2) * 8))
END IF
' bit 6 of byte
IF (RealHold(bytec heck) AND &H40) = 64 THEN
Significand# = Significand# + power(2, (6 + (bytecheck - 2) * 8))
END IF
' bit 7 of byte
IF (RealHold(bytec heck) AND &H80) = 128 THEN
Significand# = Significand# + power(2, (7 + (bytecheck - 2) * 8))
END IF
NEXT
' normalize the number by dividing calculated number by a number with all
' bits turned on: 2 to the power of 40
Significand# = Significand# / power(2, 40)
' calculate in the exponent
Number# = Significand# * power(2, (RealHold(1) - 128))
' set the pos/neg sign
IF positive > 0 THEN Number# = Number# * -1
NewCost# = Number#
END

Nov 20 '05 #17
The exact representation of the Pascal Real type is:
Sign Significand Exponent
Width (bits) 1 39 8

David

"David Scemama" <da***********@ nospam.wanadoo. fr> wrote in message
news:eF******** ******@TK2MSFTN GP12.phx.gbl...
The Pascal Real type, is stored on 6 bytes with a very special coding. When you write a real value in a file, 6 bytes are written to represent the value (obviously, no language writes the string representation of the real !). My function reads the 6 bytes and convert them to a VB double.

I need the reverse function !

David
"One Handed Man" <Bo****@Duck.ne t> wrote in message
news:bp******** **@titan.btinte rnet.com...
I probably have not understood you correctly, but can you not simply

convert
the double to a string an then truncate the string to the correct length?
As far as I am aware, a real number is simply a number which is not
imaginary, so I dont know how this differs in a Pascal Real number. Your
function seems to convert a string into a double but goes a long way

around.
BTW, I actually tried to convert "1.2345" and it returned 0.0

I'm sure Im missing something here, can you illuminate ?

Regards - OHM

David Scemama wrote:
Hi,

I'm writing a program using VB.NET that needs to communicate with a
DOS Pascal program than cannot be modified. The communication channel
is through some file databases, and I have a huge problem writing VB
Double values to the file so as the Pascal program can read them as
Pascal Real values.

I've managed to find the algorithm to read the Pascal Real format and
convert it to a VB Double, but I cannot figure out the opposite
algorithm.

Can someone help me reverse my algorithm and develop the function
"DoubleToRe al (ByVal Data As Double) As String"

Here is the conversion from real to double:

Public Function RealToDouble(By Val Data As String) As Double
Dim dMantissa As Double
Dim i As Integer
Dim j As Long
Dim k As Long

If Len(Data) <> 6 Then
'Err.Raise
'exception
Exit Function
End If

'accumulate the mantissa
dMantissa = 1
For i = 6 To 2 Step -1
For j = CType(IIf(i = 6, 6, 7), Long) To 0 Step -1
k = k + 1
If (Asc(Mid$(Data, i, 1)) And CType(2 ^ j, Long)) <>
0 Then dMantissa = dMantissa + 2 ^ -k
End If
Next j
Next i

'finally, assemble all the pieces into a number
If (Asc(Mid$(Data, 6, 1)) And &H80) = &H80 Then
RealToDouble = -dMantissa * 2 ^ (Asc(Mid$(Data, 1, 1)) -
129) Else
RealToDouble = dMantissa * 2 ^ (Asc(Mid$(Data, 1, 1)) -
129) End If

Try
Return ([Decimal].Round(CDec(Rea lToDouble), 2))
Catch ex As Exception
'MsgBox("RealTo Double, Conversion error: " & Data & "; " &
RealToDouble.To String, MsgBoxStyle.Cri tical)
Return 0
End Try

End Function

Thanks for your help
David



Nov 20 '05 #18

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

17
3022
by: Pascal | last post by:
Hello, I've a binary file with data in it. This file come from an old ms dos application (multilog ~ 1980). In this application, a field is declared as a 'decimal' (999 999 999.99). I put 0.00 in the field and save the record to the file. When I look in the binary file (with python or an hex editor), the field is stored on 8 bytes: 00-00-00-00-00-00-7F-00. I try unpack from struct module but the result isn't good.
5
6031
by: Al | last post by:
I am about to start rewriting a fortran program to ansi C++. Would it be best to convert the variables that are 'real' to float? double? long double?
12
16548
by: Alan | last post by:
how to convert double to short ? for example, I want to convert double doubleVal1 = 15000.1; double doubleVal2 = 12000.0; short shortVal; shortVal = doubleVal1 - doubleVal2; I want the result of shortVal = 3000 and store as short instead of double
28
2274
by: Skybuck Flying | last post by:
Hi, I think I understand now a bit better what the difference is between a c compiler and a pascal compiler. For example: When compiling source code with a pascal compiler. The pascal compiler will simply stop when it is missing an implementation for a procedure or whatever.
2
4962
by: Pascal | last post by:
Why does this not work, and how should i do this convert in stead: string x = double.MinValue.ToString(); double y = Convert.ToDouble(x); i get this exception: An unhandled exception of type 'System.OverflowException' occurred in mscorlib.dll Additional information: Value was either too large or too small for a Double. Pascal
2
1804
by: Piterek | last post by:
Hello. I have a question, did someone can convert from VB.NET source code to Delphi7 code? Dim n, x As Double Dim tab() As Double = {-3, 0.5, -0.05} ------------------------------------------------- Sub licz() Dim i As Integer x = 0 For i = 0 To 2
5
1306
by: karmalax | last post by:
public static string Somme(string T) { string text1 = ""; double num5 = Strings.Len(T) + 1; int num3 = 7;
3
8748
by: mrajanikrishna | last post by:
Hi Friends, I am accepting a number from the user entered in a textbox. I want to assign to a variable in my code and assignt this to that variable. double num1 = (double)txtNum1.text; this produced an error
54
3172
by: Ruud | last post by:
Hallo allemaal, During the conversion of my program from Pascal to C, I was more or less able to find the C equivalent of most Pascal functions so far. Only four gave me some real trouble. I solved them but it could be I overlooked something. 1) In Pascal you can declare functions inside a function. AFAIK this is not possible with C. Or am I wrong?
0
9589
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However, people are often confused as to whether an ONU can Work As a Router. In this blog post, we’ll explore What is ONU, What Is Router, ONU & Router’s main usage, and What is the difference between ONU and Router. Let’s take a closer look ! Part I. Meaning of...
0
9423
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it. First, let's disable language synchronization. With a Microsoft account, language settings sync across devices. To prevent any complications,...
1
9995
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows Update option using the Control Panel or Settings app; it automatically checks for updates and installs any it finds, whether you like it or not. For most users, this new feature is actually very convenient. If you want to control the update process,...
0
8872
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing, and deployment—without human intervention. Imagine an AI that can take a project description, break it down, write the code, debug it, and then launch it, all on its own.... Now, this would greatly impact the work of software developers. The idea...
1
7410
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new presenter, Adolph Dupré who will be discussing some powerful techniques for using class modules. He will explain when you may want to use classes instead of User Defined Types (UDT). For example, to manage the data in unbound forms. Adolph will...
0
6674
by: conductexam | last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and then checking html paragraph one by one. At the time of converting from word file to html my equations which are in the word document file was convert into image. Globals.ThisAddIn.Application.ActiveDocument.Select();...
0
5304
by: TSSRALBI | last post by:
Hello I'm a network technician in training and I need your help. I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs. The last exercise I practiced was to create a LAN-to-LAN VPN between two Pfsense firewalls, by using IPSEC protocols. I succeeded, with both firewalls in the same network. But I'm wondering if it's possible to do the same thing, with 2 Pfsense firewalls...
2
3563
muto222
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.
3
2815
bsmnconsultancy
by: bsmnconsultancy | last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating effective websites that not only look great but also perform exceptionally well. In this comprehensive...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.