表紙 / 自作ソフト / 日記 / 宝箱 / サイト情報 / 検索
一般 / 新C言語 / 駄文

プログラミング言語 C の新機能


←前頁へ◎表紙へ次頁へ→
 
 

1. 概略
1.1 はじめに
1.2 新しい予約語
1.3 新しいヘッダファイル
2. C プリプロセッサ
2.1 新しいコメント表記方法
2.2 空引数を許された関数型マクロ呼出し
2.3 可変個数引数を持つマクロ定義
2.4 あらかじめ定義されているマクロ名
2.5 プログラミング言語 C 標準プラグマ
2.6 単項演算子 _Pragma
2.7 プリプロセッサ式における整数型
2.8 文字列定数とワイド文字列定数の結合
3. 字句
3.1 ユニバーサルキャラクタ名
3.2 拡張された識別名使用文字
3.3 浮動小数点定数の 16 進数表記
4. 配列
4.1 可変長配列
4.2 構造体中の 0 長配列メンバ
4.3 配列要素中の記憶/型修飾子
5. 整数型
5.1 _Bool 型
5.2 long long int 型
5.3 long long int 型の定数
5.4 整数除算
6. 複素数型
6.1 _Complex 型
6.2 _Imaginary 型
6.3 複素数に関する四則演算
7. 文法一般
7.1 暗黙の関数宣言
7.2 宣言時の暗黙の型
7.3 前定義識別名 __func__
7.4 enum 宣言での余分なカンマ
7.5 inline 関数定義
7.6 restrict ポインタ
7.7 変数宣言と実行コードの位置関係
7.8 指示付きの初期化子 (Designated Initializer)
7.9 複合リテラル (Compound Literal)
7.10 選択文と反復文のブロック化
8. 標準ライブラリ(拡張)
8.1 ctype.h
8.2 float.h
8.3 math.h
8.4 stdarg.h
8.5 stdio.h
8.6 stdlib.h
8.7 wchar.h
8.8 wctype.h
9. 標準ライブラリ(新規)
9.1 complex.h: 複素数
9.2 fenv.h: 浮動小数点環境
9.3 inttypes.h
9.4 stdbool.h
9.5 stdint.h
9.6 tgmath.h: 型総称数学関数
A. 付録
A.1 strftime 書式指定子
A.2 printf の書式

6. 複素数型
 今回の C 言語では新たに複素数の支援が入りました。本章ではその結果として導入された、_Complex 型と _Imaginary 型、そしてそれらの型での演算について説明します。

6.1 _Complex 型
 _Complex 型は規格を満たしている C 言語処理系であるならいつでも使える型で(ただし freestanding 用の実装は除く)、実際は次の型の総称です。
  float _Complex / double _Complex / long double _Complex
さて、複素数は実数部(real part)と虚数部(imaginary part)の二つの部分からなっています。したがって、これを計算機で扱うためには、実数部と虚数部にそれぞれ浮動小数点型を割り当てて、実数部と虚数部をまとめて管理するのが最も簡潔な方法です。各型の _Complex の前についている浮動小数点型がその各部の実際の型を表しています。例えば、double _Complex 型なら、実数部は double 型、虚数部も double 型です。
 実数部と虚数部の管理の方法も決まっています。二つの要素を持った実数型の align された配列として管理します。始めの要素が実数部、残りが虚数部を示しています。例えば、double _Complex 型なら、typedef struct { double c[2]; } double_Complex; で、double_Complex dc; の時、dc.c[0] が実数部、dc.c[1] が虚数部ということです(実際は dc.c[1] の様にはアクセスできません)。
 次にキャストについて説明します。浮動小数点数を _Complex 型にキャストする場合には、_Complex 型の実数部がその浮動小数点数に、虚数部が 0 になります。また _Complex 型の変数を浮動小数点型にキャストする場合には、_Complex 型の変数の虚数部が捨てられて、実数部が取り出されます。

6.2 _Imaginary 型
 _Imaginary 型は、複素数における虚数部の値を示すための型で、マクロ __STD_IEC_559_COMPLEX__ が定義されている環境だけで使用することができます。このマクロは _Imaginary 型の仕様が informative な仕様 (Annex G) であることを認識する必要から存在しています。
 _Imaginary 型も _Complex 型と同様に次に示す型の総称です。
  float _Imaginary, double _Imaginary, long double _Imaginary
意味も _Complex 型と同様に、_Imaginary の前のそれぞれが複素数の虚数部の実際の数値の型を示しており、その型の表現はその浮動小数点型と同一です。例えば、double _Imaginary なら、その実際の型の構造は double 型と同一です。
 次にキャストについて説明します。まず、浮動小数点数を _Imaginary にキャストすると、それは (_Imaginary)+0.0 という値になります。また、_Imaginary 型の値を浮動小数点型にキャストすると、その値は +0.0 になります。ただし、_Imaginary 型を _Bool 型にキャストする場合、(_Imaginary)0 の場合にのみ 0 にキャストされます。それ以外の場合は 1 になります。_Imaginary 型の値を _Complex 型にキャストする場合には、変換後の _Complex の実数部は +0.0、虚数部はその _Imaginary 型の値になります。そして、_Complex 型の値を _Imaginary 型にキャストする場合、_Complex 型の実数部は捨てられ、虚数部がその結果として残ります。

6.3 複素数に関する四則演算
 複素数に関する四則演算について以下に示します。ただし、実数型とあるのは、float, double, long double 型のことを指しています。また、灰色の部分の計算を行おうとすると、例外が発生するかも知れません。ただし、complex.h を include して #pragma STDC CX_LIMITED_RANGE を on にすると灰色の部分の例外が発生しなくなります。デフォルトは off なので例外が発生するようになっています。
 ...と仕様で言っているのではないかと...。

足し算/引き算
±実数型
c
_Imaginary型
di
_Complex型
c+di
実数型
a
実数型
a±c
_Complex型
a±di
_Complex型
(a±c)±di
_Imaginary型
bi
_Complex型
±c+bi
_Imaginary型
(b±d)i
_Complex型
±c+(b±d)i
_Complex型
a+bi
_Complex型
(a±c)+bi
_Complex型
a+(b±d)i
_Complex型
(a±c)+(b±d)i


掛け算
×実数型
c
_Imaginary型
di
_Complex型
c+di
実数型
a
実数型
a×c
_Imaginary型
(a×d)i
_Complex型
(a×c)+(a×d)i
_Imaginary型
bi
_Imaginary型
(b×c)i
実数型
-(b×d)
_Complex型
-(b×d)+(b×c)i
_Complex型
a+bi
_Complex型
(a×c)+(b×c)i
_Complex型
-(b×d)+(a×d)i
_Complex型
(a×c)-(b×d)+(a×d+b×c)i


割り算
÷実数型
c
_Imaginary型
di
_Complex型
c+di
実数型
a
実数型
a
──
c
_Imaginary型
a
- ── i
d
_Complex型

(a×c)-(a×d)i
───────
c2+d2
_Imaginary型
bi
_Imaginary型
b
── i
c
実数型
b
──
d
_Complex型

(b×d)-(b×c)i
───────
c2+d2
_Complex型
a+bi
_Complex型
a    b
── + ── i
c    c
_Complex型
b    a
── - ── i
d    d
_Complex型

a×c+b×d+(b×c-a×d)i
────────────
c2+d2



←前頁へ◎表紙へ次頁へ→
 
 
表紙 - 著作権 - 注意事項 - リンクについて - 404 エラーについて
(c)1999-2014 seclan. All rights reserved.