Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/lib/libast/sfio/sfdlen.c
1810 views
1
/***********************************************************************
2
* *
3
* This software is part of the ast package *
4
* Copyright (c) 1985-2011 AT&T Intellectual Property *
5
* and is licensed under the *
6
* Eclipse Public License, Version 1.0 *
7
* by AT&T Intellectual Property *
8
* *
9
* A copy of the License is available at *
10
* http://www.eclipse.org/org/documents/epl-v10.html *
11
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
12
* *
13
* Information and Software Systems Research *
14
* AT&T Research *
15
* Florham Park NJ *
16
* *
17
* Glenn Fowler <[email protected]> *
18
* David Korn <[email protected]> *
19
* Phong Vo <[email protected]> *
20
* *
21
***********************************************************************/
22
#include "sfhdr.h"
23
24
/* Return the length of a double value if coded in a portable format
25
**
26
** Written by Kiem-Phong Vo
27
*/
28
29
#if __STD_C
30
int _sfdlen(Sfdouble_t v)
31
#else
32
int _sfdlen(v)
33
Sfdouble_t v;
34
#endif
35
{
36
#define N_ARRAY (16*sizeof(Sfdouble_t))
37
reg int n, w;
38
Sfdouble_t x;
39
int exp;
40
41
if(v < 0)
42
v = -v;
43
44
/* make the magnitude of v < 1 */
45
if(v != 0.)
46
v = frexpl(v,&exp);
47
else exp = 0;
48
49
for(w = 1; w <= N_ARRAY; ++w)
50
{ /* get 2^SF_PRECIS precision at a time */
51
n = (int)(x = ldexpl(v,SF_PRECIS));
52
v = x-n;
53
if(v <= 0.)
54
break;
55
}
56
57
return 1 + sfulen(exp) + w;
58
}
59
60