strtod32() - strtod64() - strtod128() — 文字ストリングから 10 進浮動小数点への変換

形式

#define __STDC_WANT_DEC_FP__
#include <stdlib.h>
_Decimal32 strtod32(const char *nptr, char **endptr);
_Decimal64 strtod64(const char *nptr, char **endptr);
_Decimal128 strtod132(const char *nptr, char **endptr);

言語レベル

ANSI

スレッド・セーフ

はい

ロケール依存

これらの関数の振る舞いは、現行ロケールの LC_CTYPE カテゴリーおよび LC_NUMERIC カテゴリーの影響を受ける可能性があります。 詳しくは、 CCSID とロケールについてを参照してください。

説明

strtod32()strtod64()、および strtod128() 関数は、文字ストリングを単精度、倍精度、または 4 倍精度の 10 進浮動小数点値に変換します。 パラメーター nptr は、数値 10 進浮動小数点値として解釈できる 文字のシーケンスを示します。 これらの関数によって、数値の一部として認識できないストリングは、 先頭文字のところで読み取りが停止されます。 この文字は、ストリングの最後にある ヌル文字である場合もあります。 endptr パラメーターは、 endptr が NULL ポインターでない場合、この文字を指すように更新されます。

strtod32()strtod64()、および strtod128() 関数は、 nptr が以下の形式のストリングを指すことを想定しています。

構文図を読むビジュアル構文図をスキップwhitespace +  – 数字.数字.数字eE +  – 数字

最初の文字がこの形式に適合しない場合、走査は停止されます。 さらに、以下のシーケンスがあります。INFINITYまたはNAN(大/小文字を無視して) 許可されます。

戻り値

strtod32()strtod64()、および strtod128() 関数は、表現によってアンダーフローまたはオーバーフローが発生する場合を除き、浮動小数点数の値を戻します。 オーバーフローの場合、 strtod32()HUGE_VAL_D32 または -HUGE_VAL_D32を返し、 strtod64()HUGE_VAL_D64 または -HUGE_VAL_D64を返します。 strtod128()HUGE_VAL_D128 または -HUGE_VAL_D128を返します。 アンダーフローの場合、すべての関数は +0.E0 を戻します。

オーバーフローの場合もアンダーフローの場合も、errno ERANGE に設定されます。 nptr が指すストリングが想定する形式ではない場合、 +0.E0 の値が戻されます。nptr の値は、 endptr が指すオブジェクトに保管されます (但し、endptr NULL ポインターでない場合に限られます)。

strtod32()strtod64()、および strtod128() 関数は、指数として読み取られる E または e の後に数字以外の文字があっても失敗しません。 例えば、100elf は 浮動小数点値 100.0 に変換されます。

以下の文字シーケンスINFINITY(大/小文字を無視して) INFINITY の値を生成します。 文字値:NANは、Quiet Not-A-Number (NaN) 値を生成します。

戻り値は必要に応じて、丸めモード Round to Nearest、Ties to Even を使用して丸められます。

この例では、ストリングを単精度、倍精度、および 4 倍精度の 10 進浮動小数点値に変換します。 変換済みの値および変換を停止したサブストリングを出力します。

#define __STDC_WANT_DEC_FP__
#include <stdlib.h>
#include <stdio.h>
 
int main(void)
{
   char *string, *stopstring;
   _Decimal32 d32;
   _Decimal64 d64;
   _Decimal128 d128;
 
   string = "3.1415926This stopped it";
   d32 = strtod32(string, &stopstring); 
   printf("string = %s\n", string);
   printf(" strtod32 = %Hf\n", d32);
   printf(" Stopped scan at %s\n\n", stopstring); 
   string = "100ergs"; 
   d32 = strtod32(string, &stopstring); 
   printf("string = \"%s\"\n", string);
   printf(" strtof = %Hf\n", d32); 
   printf(" Stopped scan at \"%s\"\n\n", stopstring); 
  
   string = "3.1415926This stopped it";
   d64 = strtod64(string, &stopstring); 
   printf("string = %s\n", string); 
   printf(" strtod = %Df\n", d64); 
   printf(" Stopped scan at %s\n\n", stopstring); 
   string = "100ergs"; 
   d64 = strtod64(string, &stopstring); 
   printf("string = \"%s\"\n", string); 
   printf(" strtod = %Df\n", d64); 
   printf(" Stopped scan at \"%s\"\n\n", stopstring);

   string = "3.1415926This stopped it"; 
   d128 = strtod128(string, &stopstring); 
   printf("string = %s\n", string); 
   printf(" strtold = %DDf\n", d128); 
   printf(" Stopped scan at %s\n\n", stopstring); 
   string = "100ergs"; 
   d128 = strtod128(string, &stopstring); 
   printf("string = \"%s\"\n", string); 
   printf(" strtold = %DDf\n", d128); 
   printf(" Stopped scan at \"%s\"\n\n", stopstring);
}

/***************** Output should be similar to: ***************** 

string = 3.1415926This stopped it 
 strtof = 3.141593 
 Stopped scan at This stopped it 

string = "100ergs" 
 strtof = 100.000000 
 Stopped scan at "ergs"

string = 3.1415926This stopped it 
 strtod= 3.141593 
 Stopped scan at This stopped it 

string = "100ergs" 
 strtod = 100.000000 
 Stopped scan at "ergs"
string = 3.1415926This stopped it 
 strtold = 3.141593 
 Stopped scan at This stopped it 

string = "100ergs" 
 strtold = 100.000000 
 Stopped scan at "ergs"

*/

関連情報