GNU Decimal Float関数の使い方

高精度のDecimal関数を使用する場合、GNUには標準でDecimal Float関数が入っておらず、GNU Decimal Float C Libraryとして提供されており、別途追加で導入が必要である。

C++関数からはC関数として呼び出す必要がある。

呼び出しの例:

以下のC言語の外部宣言を追加する。
#define __STDC_WANT_DEC_FP__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define M_KS_SIZE 22+1+1
extern char *decimalfloatSample( char * );
extern "C" {
// C言語関数宣言
typedef float _Decimal128 __attribute__((mode(TD)));
extern _Decimal128 strtod128 (__const char *__restrict __nptr,
                     char **__restrict __endptr)
     __THROW __nonnull ((1)) __wur;
}

char *decimalfloatSample(char *val)
{
static char chaRetVal[M_KS_SIZE+1];
char chaInBuff[M_KS_SIZE+1];
_Decimal128 decimal1;
memset( chaInBuff, 0, sizeof(val) );
strcpy( chaInBuff, val );
decimal1 = strtod128(chaInBuff, NULL);
memset( chaRetVal, 0, sizeof(chaRetVal) );
decimal1 = decimal1 + 1.1DD; //for test
sprintf( chaRetVal, "%0.3DDf", decimal1 );
return chaRetVal;
}

makefileの例:

SRCDIR     = .
OBJDIR     = .
LIBDIR     = .
TARGETDIR  = /usr/local/lib/
TARGETLIB  = $(LIBDIR)/libdecimalfloatSample.so
TARGETOBJ = $(OBJDIR)/decimalfloatSample.o
TARGETSRC = $(SRCDIR)/decimalfloatSample.c
LOOKUPOBJ = /usr/local/lib/libdfp.so
#INC = libdfp-1.0.16をinstallすると以下のフォルダにDecimal Float対応のheaderファイルが格納されコンパイラーから標準でアクセスできるようになる。
#INC = /usr/local/include/dfp
CC = g++
CCOPTIONS = -c -O -fPIC -Wno-deprecated -m64 -mtune=generic -mcmodel=small
LIBCC     = $(CC)
LDOPTIONS = -shared -m64
.SUFFIXES: .c .o
# rules
all: $(TARGETLIB)

$(TARGETLIB): $(TARGETOBJ) $(LOOKUPOBJ)
$(LIBCC) $(LDOPTIONS) $(TARGETOBJ) $(LOOKUPOBJ) -o $(TARGETLIB)

$(TARGETOBJ): $(TARGETSRC)
$(CC) $(CCOPTIONS) $(TARGETSRC) -o $(TARGETOBJ)

clean:
@rm -f $(TARGETOBJ) $(TARGETLIB)

install:
@cp -p $(TARGETLIB) $(TARGETDIR)

GNU Decimal Floatライブラリの導入:

概要:
The "Decimal Floating Point C Library" is an implementation of ISO/IEC
Technical report  "ISO/IEC TR 24732" which describes the C-Language library routines necessary to provide the C library runtime support for decimal floating point data types introduced in IEEE 754-2008, namely _Decimal32,_Decimal64, and _Decimal128.
Libdfp was designed by Ryan S. Arnold (IBM), Janis Johnson (IBM), and Steven
J. Munroe (IBM) in 2006.
Libdfp was originally written as a GLIBC add-on by Ryan S. Arnold
<rsa@us.ibm.com> and Joseph Kerian <jkerian@us.ibm.com> in 2006 and
contributed to the Free Software Foundation by IBM in 2007.

GNUサイトよりRelease 1.0.16(最新)のライブラリをダウンロードする。
https://github.com/libdfp/libdfp/releases
libdfp-1.0.16.tar.gz
導入:
WORK フォルダにlibdfp-1.0.16.tar.gzを配置する。
# cd $(WORK)
# tar -zxvf libdfp-1.0.16.tar.gz
# cd $(WORK)/libdfp-1.0.16
# ./configure && make && make install
make installによりコンパイルされた共有ライブラリ、headerファイルなどを/usr/local/lib, /usr/local/includeなどに導入される。

コメント

人気の投稿