mirror of
https://gitlab.com/siarp/siarp.de.git
synced 2026-08-07 19:18:17 +00:00
1c6e73937f
* remove httrack meta files * rename site dir to "public"
211 lines
20 KiB
HTML
211 lines
20 KiB
HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN"
|
|
"http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">
|
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" version="XHTML+RDFa 1.0" dir="ltr">
|
|
|
|
|
|
<!-- Mirrored from siarp.de/node/191 by HTTrack Website Copier/3.x [XR&CO'2014], Sun, 08 Dec 2019 12:01:16 GMT -->
|
|
<!-- Added by HTTrack --><meta http-equiv="content-type" content="text/html;charset=utf-8" /><!-- /Added by HTTrack -->
|
|
<head profile="http://www.w3.org/1999/xhtml/vocab">
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
<meta name="Generator" content="Drupal 7 (http://drupal.org)" />
|
|
<link rel="canonical" href="index.html" />
|
|
<link rel="shortlink" href="index.html" />
|
|
<title>Borland Real48 in Java | siarp.de</title>
|
|
<link type="text/css" rel="stylesheet" href="../../sites/siarp.de/files/css/css_xE-rWrJf-fncB6ztZfd2huxqgxu4WO-qwma6Xer30m4.css" media="all" />
|
|
<link type="text/css" rel="stylesheet" href="../../sites/siarp.de/files/css/css_NdVgz6YKifxQUEsW5xls_zI7Pn2F7E5U5Wb29zcu3vo.css" media="all" />
|
|
<link type="text/css" rel="stylesheet" href="../../sites/siarp.de/files/css/css_OAqUol8y_hmU_lCucLyaRX-a1G627sWWbvG_VG1GKnE.css" media="all" />
|
|
<link type="text/css" rel="stylesheet" href="../../sites/siarp.de/files/css/css_xPIRNNJGw8EiKyuE5b-xAtWWTQ8U1_huTr4xL09Dq2A.css" media="all" />
|
|
<link type="text/css" rel="stylesheet" href="../../sites/siarp.de/files/css/css_k3snrbsthqot7V7ccRZHS9OkCZkwBv4adtNieIVlbEU.css" media="print" />
|
|
|
|
<!--[if lt IE 7]>
|
|
<link type="text/css" rel="stylesheet" href="http://siarp.de/themes/garland/fix-ie.css?q26w7t" media="all" />
|
|
<![endif]-->
|
|
<script type="text/javascript" src="../../sites/siarp.de/files/js/js_qikmINIYTWe4jcTUn8cKiMr8bmSDiZB9LQqvceZ6wlM.js"></script>
|
|
<script type="text/javascript">
|
|
<!--//--><![CDATA[//><!--
|
|
jQuery.extend(Drupal.settings, {"basePath":"\/","pathPrefix":"","ajaxPageState":{"theme":"garland","theme_token":"EzZ_0tfXitx9LzPnUlFs6QLpb0B0zzteIPh4jbcTlt4","js":{"misc\/jquery.js":1,"misc\/jquery-extend-3.4.0.js":1,"misc\/jquery.once.js":1,"misc\/drupal.js":1},"css":{"modules\/system\/system.base.css":1,"modules\/system\/system.menus.css":1,"modules\/system\/system.messages.css":1,"modules\/system\/system.theme.css":1,"modules\/comment\/comment.css":1,"modules\/field\/theme\/field.css":1,"modules\/node\/node.css":1,"modules\/user\/user.css":1,"sites\/all\/modules\/views\/css\/views.css":1,"sites\/all\/modules\/ctools\/css\/ctools.css":1,"public:\/\/geshi\/geshifilter-languages.css":1,"sites\/siarp.de\/modules\/geshifilter\/geshifilter.css":1,"themes\/garland\/style.css":1,"themes\/garland\/print.css":1,"themes\/garland\/fix-ie.css":1}}});
|
|
//--><!]]>
|
|
</script>
|
|
</head>
|
|
<body class="html not-front not-logged-in one-sidebar sidebar-second page-node page-node- page-node-191 node-type-story fluid-width" >
|
|
<div id="skip-link">
|
|
<a href="#main-content" class="element-invisible element-focusable">Skip to main content</a>
|
|
</div>
|
|
|
|
<div id="wrapper">
|
|
<div id="container" class="clearfix">
|
|
|
|
<div id="header">
|
|
<div id="logo-floater">
|
|
<div id="branding"><strong><a href="../../">
|
|
<span>siarp.de</span> </a></strong></div>
|
|
</div>
|
|
|
|
</div> <!-- /#header -->
|
|
|
|
|
|
<div id="center"><div id="squeeze"><div class="right-corner"><div class="left-corner">
|
|
<h2 class="element-invisible">You are here</h2><div class="breadcrumb"><a href="../../">Home</a></div> <a id="main-content"></a>
|
|
<div id="tabs-wrapper" class="clearfix"> <h1 class="with-tabs">Borland Real48 in Java</h1>
|
|
</div> <div class="clearfix">
|
|
<div class="region region-content">
|
|
<div id="block-system-main" class="block block-system clearfix">
|
|
|
|
|
|
<div class="content">
|
|
<div id="node-191" class="node node-story node-promoted">
|
|
|
|
|
|
|
|
<span class="submitted">24. January 2009 - 9:47 — <span class="username">Tilman</span></span>
|
|
|
|
<div class="content clearfix">
|
|
<div class="field field-name-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><p>When writing a converter tool for a binary file format, I had problems reading some of the floating point numbers. After a little bit of research I found out that this very special format was used in programs written in Borland Pascal/Delphi. Since I couldn't find any Java class that's able to read this kind of number I wrote it myself.</p>
|
|
|
|
<p>As far as I remember these are basically reverse IEEE floating point numbers of six bytes. (It's been a while since I wrote this. See the PDF file by Richard Biffl for a detailed description of the format.)</p>
|
|
|
|
<p>References:</p>
|
|
|
|
<ul>
|
|
<li><a href="http://www.wotsit.org/list.asp?search=Borland+Pascal+Real&button=GO!" title="Borland Pascal Real format information and C code">Borland Pascal Real format information and C code by Richard Biffl on wotsit.org</a></li>
|
|
<li><a href="http://mail.python.org/pipermail/python-list/2001-December/117947.html" title="Algorithms for 6-byte ('real48') Borland Pascal Floating Point numbers">Real48 in Python by Martin Bless</a></li>
|
|
</ul>
|
|
|
|
<p>And here is the code:</p>
|
|
|
|
<div class="geshifilter"><div class="java geshifilter-java"><span class="kw1">package</span> <span class="co2">de.tilman.util</span><span class="sy0">;</span><br />
|
|
<br />
|
|
<span class="kw1">import</span> <span class="co2">java.math.BigDecimal</span><span class="sy0">;</span><br />
|
|
<br />
|
|
<span class="co3">/**<br />
|
|
* A class for representation and conversion of 6-byte/48-bit floating<br />
|
|
* point numbers used in Borland Pascal/Delphi.<br />
|
|
* <br />
|
|
* @author Tilman Walther<br />
|
|
*/</span><br />
|
|
<span class="kw1">public</span> <span class="kw1">class</span> Real48 <span class="br0">{</span><br />
|
|
<br />
|
|
<span class="kw4">char</span><span class="br0">[</span><span class="br0">]</span> bytes<span class="sy0">;</span><br />
|
|
<span class="kw4">double</span> value<span class="sy0">;</span><br />
|
|
<br />
|
|
<span class="co3">/**<br />
|
|
* Represents a number in Real48 format.<br />
|
|
* <br />
|
|
* @param bytes the byte values of the number<br />
|
|
*/</span><br />
|
|
<span class="kw1">public</span> Real48<span class="br0">(</span><span class="kw4">char</span><span class="br0">[</span><span class="br0">]</span> bytes<span class="br0">)</span> <span class="br0">{</span><br />
|
|
<span class="kw1">this</span>.<span class="me1">bytes</span> <span class="sy0">=</span> bytes<span class="sy0">;</span><br />
|
|
<span class="kw1">this</span>.<span class="me1">value</span> <span class="sy0">=</span> Real48.<span class="me1">getDoubleFromBytes</span><span class="br0">(</span>bytes<span class="br0">)</span><span class="sy0">;</span><br />
|
|
<span class="br0">}</span><br />
|
|
<br />
|
|
<span class="co3">/**<br />
|
|
* Returns the value of the number as double.<br />
|
|
* <br />
|
|
* @return the number as double<br />
|
|
*/</span><br />
|
|
<span class="kw1">public</span> <span class="kw4">double</span> getDoubleValue<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span><br />
|
|
<span class="kw1">return</span> value<span class="sy0">;</span><br />
|
|
<span class="br0">}</span><br />
|
|
<br />
|
|
<span class="co3">/**<br />
|
|
* Returns the byte values of the Real48 as char[].<br />
|
|
* <br />
|
|
* @return the byte values<br />
|
|
*/</span><br />
|
|
<span class="kw1">public</span> <span class="kw4">char</span><span class="br0">[</span><span class="br0">]</span> getBytes<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span><br />
|
|
<span class="kw1">return</span> bytes<span class="sy0">;</span><br />
|
|
<span class="br0">}</span><br />
|
|
<br />
|
|
<span class="co3">/**<br />
|
|
* Converts a Real48 in a double.<br />
|
|
* <br />
|
|
* @param bytes the number in Real48 format<br />
|
|
* @return the number as double<br />
|
|
*/</span><br />
|
|
<span class="kw1">public</span> <span class="kw1">static</span> <span class="kw4">double</span> getDoubleFromBytes<span class="br0">(</span><span class="kw4">char</span><span class="br0">[</span><span class="br0">]</span> bytes<span class="br0">)</span> <span class="br0">{</span><br />
|
|
<span class="kw4">long</span><span class="br0">[</span><span class="br0">]</span> real48 <span class="sy0">=</span> <span class="kw1">new</span> <span class="kw4">long</span><span class="br0">[</span><span class="nu0">6</span><span class="br0">]</span><span class="sy0">;</span><br />
|
|
real48<span class="br0">[</span><span class="nu0">0</span><span class="br0">]</span> <span class="sy0">=</span> bytes<span class="br0">[</span><span class="nu0">0</span><span class="br0">]</span><span class="sy0">;</span><br />
|
|
real48<span class="br0">[</span><span class="nu0">1</span><span class="br0">]</span> <span class="sy0">=</span> bytes<span class="br0">[</span><span class="nu0">1</span><span class="br0">]</span><span class="sy0">;</span><br />
|
|
real48<span class="br0">[</span><span class="nu0">2</span><span class="br0">]</span> <span class="sy0">=</span> bytes<span class="br0">[</span><span class="nu0">2</span><span class="br0">]</span><span class="sy0">;</span><br />
|
|
real48<span class="br0">[</span><span class="nu0">3</span><span class="br0">]</span> <span class="sy0">=</span> bytes<span class="br0">[</span><span class="nu0">3</span><span class="br0">]</span><span class="sy0">;</span><br />
|
|
real48<span class="br0">[</span><span class="nu0">4</span><span class="br0">]</span> <span class="sy0">=</span> bytes<span class="br0">[</span><span class="nu0">4</span><span class="br0">]</span><span class="sy0">;</span><br />
|
|
real48<span class="br0">[</span><span class="nu0">5</span><span class="br0">]</span> <span class="sy0">=</span> bytes<span class="br0">[</span><span class="nu0">5</span><span class="br0">]</span><span class="sy0">;</span><br />
|
|
<br />
|
|
<span class="co1">// get sign</span><br />
|
|
<span class="kw4">long</span> sign <span class="sy0">=</span> <span class="br0">(</span>real48<span class="br0">[</span><span class="nu0">0</span><span class="br0">]</span> <span class="sy0">&</span> 0x80<span class="br0">)</span> <span class="sy0">>></span> <span class="nu0">7</span><span class="sy0">;</span><br />
|
|
<br />
|
|
<span class="co1">// get significand</span><br />
|
|
<span class="kw4">long</span> significand <span class="sy0">=</span> <span class="br0">(</span><span class="br0">(</span>real48<span class="br0">[</span><span class="nu0">0</span><span class="br0">]</span> <span class="sy0">%</span> 0x80<span class="br0">)</span> <span class="sy0"><<</span> <span class="nu0">32</span><span class="br0">)</span><br />
|
|
<span class="sy0">+</span> <span class="br0">(</span>real48<span class="br0">[</span><span class="nu0">1</span><span class="br0">]</span> <span class="sy0"><<</span> <span class="nu0">24</span><span class="br0">)</span><br />
|
|
<span class="sy0">+</span> <span class="br0">(</span>real48<span class="br0">[</span><span class="nu0">2</span><span class="br0">]</span> <span class="sy0"><<</span> <span class="nu0">16</span><span class="br0">)</span><br />
|
|
<span class="sy0">+</span> <span class="br0">(</span>real48<span class="br0">[</span><span class="nu0">3</span><span class="br0">]</span> <span class="sy0"><<</span> <span class="nu0">8</span><span class="br0">)</span><br />
|
|
<span class="sy0">+</span> <span class="br0">(</span>real48<span class="br0">[</span><span class="nu0">4</span><span class="br0">]</span><span class="br0">)</span><span class="sy0">;</span><br />
|
|
<br />
|
|
<span class="co1">// get exponent</span><br />
|
|
<span class="kw4">long</span> exponent <span class="sy0">=</span> bytes<span class="br0">[</span><span class="nu0">5</span><span class="br0">]</span><span class="sy0">;</span><br />
|
|
<br />
|
|
<span class="co1">// if the exponent is zero the real represents zero, too</span><br />
|
|
<span class="kw1">if</span> <span class="br0">(</span>exponent <span class="sy0">==</span> <span class="nu0">0</span><span class="br0">)</span> <span class="br0">{</span><br />
|
|
<span class="kw1">return</span> <span class="nu0">0.0</span><span class="sy0">;</span><br />
|
|
<span class="br0">}</span><br />
|
|
<br />
|
|
<span class="co1">// convert exponent (bias for Real48 is 129, bias for IEEE 754-double is 1023)</span><br />
|
|
exponent <span class="sy0">+=</span> <span class="nu0">894</span><span class="sy0">;</span><br />
|
|
<br />
|
|
<span class="kw4">long</span> bits <span class="sy0">=</span> <span class="br0">(</span>sign <span class="sy0"><<</span> <span class="nu0">63</span><span class="br0">)</span> <span class="sy0">+</span> <span class="br0">(</span>exponent <span class="sy0"><<</span> <span class="nu0">52</span><span class="br0">)</span> <span class="sy0">+</span> <span class="br0">(</span>significand <span class="sy0"><<</span> <span class="nu0">13</span><span class="br0">)</span><span class="sy0">;</span><br />
|
|
<br />
|
|
<span class="kw4">double</span> value <span class="sy0">=</span> <a href="http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+double"><span class="kw3">Double</span></a>.<span class="me1">longBitsToDouble</span><span class="br0">(</span>bits<span class="br0">)</span><span class="sy0">;</span><br />
|
|
<br />
|
|
<span class="co1">// since Real48 has only a precision of 11 we need to set all digits > 11 to zero</span><br />
|
|
<a href="http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+bigdecimal"><span class="kw3">BigDecimal</span></a> bd <span class="sy0">=</span> <span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+bigdecimal"><span class="kw3">BigDecimal</span></a><span class="br0">(</span>value<span class="br0">)</span><span class="sy0">;</span><br />
|
|
bd <span class="sy0">=</span> bd.<span class="me1">setScale</span><span class="br0">(</span><span class="nu0">11</span>, <a href="http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+bigdecimal"><span class="kw3">BigDecimal</span></a>.<span class="me1">ROUND_DOWN</span><span class="br0">)</span><span class="sy0">;</span><br />
|
|
<br />
|
|
<span class="kw1">return</span> bd.<span class="me1">doubleValue</span><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span><br />
|
|
<span class="br0">}</span><br />
|
|
<br />
|
|
<span class="br0">}</span></div></div>
|
|
</div></div></div> </div>
|
|
|
|
<div class="clearfix">
|
|
<div class="links"><ul class="links inline"><li class="comment_forbidden first last"></li>
|
|
</ul></div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="region region-footer">
|
|
<div id="block-block-3" class="block block-block clearfix">
|
|
|
|
|
|
<div class="content">
|
|
<p>Alle Rechte liegen bei siarp.</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div></div></div></div> <!-- /.left-corner, /.right-corner, /#squeeze, /#center -->
|
|
|
|
<div id="sidebar-second" class="sidebar">
|
|
<div class="region region-sidebar-second">
|
|
<div id="block-menu-menu-autoren" class="block block-menu clearfix">
|
|
|
|
<h2 class="title">Written by</h2>
|
|
|
|
<div class="content">
|
|
<ul class="menu"><li class="first leaf"><a href="../../blog/2/">Martin</a></li>
|
|
<li class="last leaf"><a href="../../blog/3/">Tilman</a></li>
|
|
</ul> </div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
</div> <!-- /#container -->
|
|
</div> <!-- /#wrapper -->
|
|
</body>
|
|
|
|
<!-- Mirrored from siarp.de/node/191 by HTTrack Website Copier/3.x [XR&CO'2014], Sun, 08 Dec 2019 12:01:16 GMT -->
|
|
</html>
|