(57)【要約】【課題】浮動小数点数の乗算を行うことができる乗算装置を提供することを課題とする。【解決手段】乗算装置は、乗数の仮数部の上位に連続するゼロの数を計数する回路（９０４）と、仮数部の固定精度の桁数及び計数値を基にシフト量を演算する回路（９０６）と、シフト量だけ被乗数である浮動小数点数の仮数部を左シフトする回路（９０５）と、仮数部の固定精度の桁数から計数値を減算して乗数の仮数部の桁数を演算する回路（９０６，９１３）と、左シフトされた被乗数の仮数部と乗数の仮数部とを基に、乗数の仮数部の桁単位で中間積を出力する乗算回路（９１５）と、被乗数及び乗数の指数部を加算する加算回路（９０２）と、乗算回路が出力する中間積を積の浮動小数点数の仮数部として出力し、加算回路により出力された値を積の浮動小数点数の指数部として出力する制御回路（９１８）とを有する。【選択図】図９
2014041474.tif 000002
【特許請求の範囲】
【請求項１】
乗数である浮動小数点数の仮数部の上位に連続するゼロの数を計数する計数回路と、
前記仮数部の固定精度の桁数及び前記計数回路が計数した計数値を基にシフト量を演算するシフト量演算回路と、
前記シフト量だけ被乗数である浮動小数点数の仮数部を左シフトするシフト回路と、
前記仮数部の固定精度の桁数から前記計数値を減算して前記乗数の仮数部の桁数を演算する桁数演算回路と、
前記シフト回路により左シフトされた被乗数の仮数部と、前記乗数の仮数部とを基に、前記乗数の仮数部の桁単位で中間積を出力する乗算回路と、
前記被乗数である浮動小数点数の指数部と前記乗数である浮動小数点の指数部とを加算した値を出力する加算回路と、
前記乗算回路が出力する中間積の回数が前記桁数演算回路により演算された桁数になる場合、前記乗算回路が出力する中間積を積の浮動小数点数の仮数部として出力し、前記加算回路により出力された値を積の浮動小数点数の指数部として出力する制御回路と
を有することを特徴とする乗算装置。
【請求項２】
前記制御回路は、前記乗算回路が出力する中間積の回数が前記桁数演算回路により演算された桁数になり、かつ前記乗算回路が出力する中間積の桁数が積の固定精度の桁数を超える場合には、前記乗算回路が出力する中間積を１桁右シフトした値を積の浮動小数点数の仮数部として出力し、前記加算回路により出力された値をインクリメントした値を積の浮動小数点数の指数部として出力することを特徴とする請求項１記載の乗算装置。
【請求項３】
さらに、前記被乗数の仮数部の上位に連続するゼロの数を計数する第２の計数回路と、
前記加算回路により出力された値に対して前記シフト量を加算して前記第２の計数回路が計数した第２の計数値を減算した値を出力する指数部補正回路とを有し、
前記シフト回路は、前記シフト量演算回路により演算されたシフト量が前記第２の計数値より大きい場合、前記第２の計数値だけ前記被乗数の仮数部を左シフトし、
前記制御回路は、前記シフト量演算回路により演算されたシフト量が前記第２の計数値より大きい場合、前記指数部補正回路により出力された値を積の浮動小数点数の指数部として出力することを特徴とする請求項１記載の乗算装置。
【請求項４】
前記制御回路は、前記乗算回路が出力する中間積の回数が前記桁数演算回路により演算された桁数になり、かつ前記乗算回路が出力する中間積の桁数が積の固定精度の桁数を超える場合には、前記乗算回路が出力する中間積を１桁右シフトした値を積の浮動小数点数の仮数部として出力し、前記指数部補正回路により出力された値をインクリメントした値を積の浮動小数点数の指数部として出力することを特徴とする請求項３記載の乗算装置。
【請求項５】
さらに、前記乗算回路が出力する中間積の回数が前記桁数演算回路により演算された桁数になり、かつ前記乗算回路が出力する中間積の桁数が積の固定精度の桁数を超える場合には、前記乗算回路が出力する中間積に対して丸め処理を行い、丸め処理した前記中間積を積の浮動小数点数の仮数部として出力する丸め処理回路を有することを特徴とする請求項１〜４のいずれか１項に記載の乗算装置。
【請求項６】
さらに、入力した前記被乗数である浮動小数点数の正負符号と前記乗数である浮動小数点数の正負符号が同じである場合、積の浮動小数点数の正負符号を正として出力し、入力した前記被乗数である浮動小数点数の正負符号と前記乗数である浮動小数点数の正負符号が異なる場合、積の浮動小数点数の正負符号を負として出力する正負符号演算回路を有することを特徴とする請求項１〜５のいずれか１項に記載の乗算装置。
【請求項７】
前記シフト量演算回路は、前記仮数部の固定精度の桁数に対して前記計数値を減算して１を減算することにより前記シフト量を演算することを特徴とする請求項１〜６のいずれか１項に記載の乗算装置。
【請求項８】
前記制御回路は、固定レイテンシの計数値を計数後に、前記積の浮動小数点数の仮数部及び指数部を出力することを特徴とする請求項１〜７のいずれか１項に記載の乗算装置。
【請求項９】
計数回路が、乗数である浮動小数点数の仮数部の上位に連続するゼロの数を計数値として計数し、
シフト量演算回路が、前記仮数部の固定精度の桁数及び前記計数値を基にシフト量を演算し、
シフト回路が、前記シフト量だけ被乗数である浮動小数点数の仮数部を左シフトし、
桁数演算回路が、前記仮数部の固定精度の桁数から前記計数値を減算することにより前記乗数の仮数部の桁数を演算し、
乗算回路が、前記シフト回路により左シフトされた被乗数の仮数部と、前記乗数の仮数部とを基に、前記乗数の仮数部の桁単位で中間積を出力し、
加算回路が、前記被乗数である浮動小数点数の指数部と前記乗数である浮動小数点の指数部とを加算した値を出力し、
制御回路が、前記乗算回路が出力する中間積の回数が前記桁数演算回路により演算された桁数になる場合には、前記乗算回路が出力する中間積を積の浮動小数点数の仮数部として出力し、前記加算回路により出力された値を積の浮動小数点数の指数部として出力することを特徴とする乗算方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、乗算装置及び乗算方法に関する。
【背景技術】
【０００２】
正規化された浮動小数点数の仮数部の乗算を行うための乗算回路を有する浮動小数点乗算装置が知られている（例えば、特許文献１参照）。第１のゼロ検出回路は、被乗数となる固定小数点数の最上位側に連続するゼロの数を検出する。第２のゼロ検出回路は、乗数となる固定小数点数の最上位側に連続するゼロの数を検出する。第１の左シフト回路は、第１のゼロ検出回路によって検出されたゼロの数だけ被乗数を左シフトして乗算回路に供給する。第２の左シフト回路は、第２のゼロ検出回路によって検出されたゼロの数だけ乗数を左シフトして乗算回路に供給する。加算器は、第１及び第２のゼロ検出回路で検出されたゼロの数を加算する。右シフト回路は、第１及び第２の左シフト回路による左シフト後の被乗数及び乗数を対象とする乗算回路の乗算結果を加算器の加算結果の示す数だけ右シフトする。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開平５−４０６０５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
特許文献１は、右シフタ回路が最大でフォーマット精度の２倍の桁幅が必要になり、物量及び遅延時間が共に大きくなる。
【０００５】
１つの側面では、本発明の目的は、小さい物量及び遅延時間で浮動小数点数の乗算を行うことができる乗算装置及び乗算方法を提供することである。
【課題を解決するための手段】
【０００６】
乗算装置は、乗数である浮動小数点数の仮数部の上位に連続するゼロの数を計数する計数回路と、前記仮数部の固定精度の桁数及び前記計数回路が計数した計数値を基にシフト量を演算するシフト量演算回路と、前記シフト量だけ被乗数である浮動小数点数の仮数部を左シフトするシフト回路と、前記仮数部の固定精度の桁数から前記計数値を減算して前記乗数の仮数部の桁数を演算する桁数演算回路と、前記シフト回路により左シフトされた被乗数の仮数部と、前記乗数の仮数部とを基に、前記乗数の仮数部の桁単位で中間積を出力する乗算回路と、前記被乗数である浮動小数点数の指数部と前記乗数である浮動小数点の指数部とを加算した値を出力する加算回路と、前記乗算回路が出力する中間積の回数が前記桁数演算回路により演算された桁数になる場合、前記乗算回路が出力する中間積を積の浮動小数点数の仮数部として出力し、前記加算回路により出力された値を積の浮動小数点数の指数部として出力する制御回路とを有する。
【発明の効果】
【０００７】
小さい物量及び遅延時間で浮動小数点数の乗算を行うことができる。
【図面の簡単な説明】
【０００８】
【図１】図１は、固定小数点数の乗算方法を説明するための図である。
【図２】図２は、非正規化浮動小数点数の乗算方法を説明するための図である。
【図３】図３は、非正規化固定精度浮動小数点数の乗算方法を説明するための図である。
【図４】図４は、第１の実施形態による第１の乗算方法を説明するための図である。
【図５】図５は、第１の実施形態による第２の乗算方法を説明するための図である。
【図６】図６は、第１の実施形態による第３の乗算方法を説明するための図である。
【図７】図７は、第１の実施形態による第４の乗算方法を説明するための図である。
【図８】図８は、第１の実施形態による第５の乗算方法を説明するための図である。
【図９】図９は、第１の実施形態による乗算装置の構成例を示す図である。
【図１０】図１０は、図９の乗算ループ回路の構成例を示す図である。
【図１１】図１１は、図１０の積生成セレクト回路の入出力の対応関係を示す図である。
【図１２】図１２（Ａ）〜（Ｄ）は、図９の制御回路の制御方法を示す図である。
【図１３】図１３は、第２の実施形態による乗算装置の構成例を示す図である。
【図１４】図１４（Ａ）〜（Ｄ）は、図１３の制御回路の制御方法を示す図である。
【発明を実施するための形態】
【０００９】
（第１の実施形態）
図１は、固定小数点数の乗算方法を説明するための図である。「０１１１１１」は、被乗数となる固定小数点１０進数である。「００１１１１」は、乗数となる固定小数点１０進数である。被乗数リーディングゼロカウント値Ｐ１は、被乗数の「０１１１１１」の上位に連続するゼロの数であり、「１」である。乗数リーディングゼロカウント値Ｐ２は、乗数の「００１１１１」の上位に連続するゼロの数であり、「２」である。「１１１１１０」は、被乗数の「０１１１１１」を被乗数リーディングゼロカウント値Ｐ１の「１」だけ左シフトした正規化数である。「１１１１００」は、乗数の「００１１１１」を乗数リーディングゼロカウント値Ｐ２の「２」だけ左シフトした正規化数である。「１２３４４３２１０００」は、被乗数の正規化数の「１１１１１０」に対して乗数の正規化数の「１１１１００」を乗算した積である。その右隣の値Ｐの「３」は、Ｐ１＋Ｐ２＝１＋２＝３で表される。積の「１２３４４３２１」は、積の「１２３４４３２１０００」を値Ｐの「３」だけ右シフトした値である。この右シフトを行うための右シフト回路は、被乗数及び乗数の固定精度の桁数が「６」の場合、最大で６×２＝１２桁必要となり、物量が大きくなってしまう。積の出力ＯＵＴ１は、６桁の固定精度の「３４４３２１」の固定小数点数であり、正確な値が得られない。
【００１０】
図２は、非正規化浮動小数点数の乗算方法を説明するための図である。浮動小数点数は、仮数部ｓｆ及び指数部ｅｘｐを有し、１０進数の場合には、ｓｆ×１０expで表される。被乗数は、「０．１１１１１」の仮数部及び「０」の指数部を有する。乗数は、「０．０１１１１」の仮数部及び「０」の指数部を有する。被乗数リーディングゼロカウント値Ｐ１は、被乗数の仮数部の「０．１１１１１」の上位に連続するゼロの数であり、「１」である。乗数リーディングゼロカウント値Ｐ２は、乗数の「０．０１１１１」の上位に連続するゼロの数であり、「２」である。被乗数の正規化仮数部の「１．１１１１０」は、被乗数の仮数部の「０．１１１１１」を被乗数リーディングゼロカウント値Ｐ１の「１」だけ左シフトした正規化数である。乗数の正規化仮数部の「１．１１１００」は、乗数の仮数部の「０．０１１１１」を乗数リーディングゼロカウント値Ｐ２の「２」だけ左シフトした正規化数である。被乗数の正規化指数部の「−１」は、被乗数の指数部の「０」から被乗数リーディングゼロカウント値Ｐ１の「１」を減算し、０−１＝−１で表される。乗数の正規化指数部の「−２」は、乗数の指数部の「０」から乗数リーディングゼロカウント値Ｐ２の「２」を減算し、０−２＝−２で表される。積の仮数部「１．２３４４３２１０００」は、被乗数の正規化仮数部の「１．１１１１０」に対して乗数の正規化仮数部の「１．１１１００」を乗算した積である。積の指数部の「−３」は、被乗数の正規化指数部の「−１」と乗数の正規化指数部の「−２」とを加算し、（−１）＋（−２）＝−３で表される。その右隣の値Ｐの「３」は、Ｐ１＋Ｐ２＝１＋２＝３で表される。積の仮数部の「０．００１２３４４３２１」は、積の仮数部の「１．２３４４３２１０００」を値Ｐの「３」だけ右シフトした値である。その右隣の指数部の「０」は、その上の指数部の「−３」と値Ｐの「３」を加算し、−３＋３＝０で表される。積の仮数部は、固定精度が６桁であるので、積の仮数部の「０．００１２３４４３２１」のうちの上位の６桁の「０．００１２３」が積の仮数部として、積の出力ＯＵＴ２が出力される。積の出力ＯＵＴ２は、「０．００１２３」の指数部と、「０」の指数部とを有する。しかし、積の出力ＯＵＴ２の仮数部は、有効桁数が３桁に減ることにより精度が悪くなる。そこで、図３に示す乗算方法が考えられる。
【００１１】
図３は、ＩＥＥＥ７５４−２００８の浮動小数点１０進数形式のような、演算結果のシフトにより正確な結果を出力できる場合には、演算結果をシフトした結果を出力する旨が定義されたフォーマットにおける非正規化固定精度浮動小数点数の乗算方法を説明するための図である。被乗数は、「０．１１０００」の仮数部及び「０」の指数部を有する。乗数は、「０．０１１００」の仮数部及び「０」の指数部を有する。被乗数リーディングゼロカウント値Ｐ１は、被乗数の仮数部の「０．１１０００」の上位に連続するゼロの数であり、「１」である。乗数リーディングゼロカウント値Ｐ２は、乗数の仮数部の「０．０１１００」の上位に連続するゼロの数であり、「２」である。被乗数の正規化仮数部の「１．１００００」は、被乗数の仮数部の「０．１１０００」を被乗数リーディングゼロカウント値Ｐ１の「１」だけ左シフトした正規化数である。乗数の正規化仮数部の「１．１００００」は、乗数の仮数部の「０．０１１００」を乗数リーディングゼロカウント値Ｐ２の「２」だけ左シフトした正規化数である。被乗数の正規化指数部の「−１」は、被乗数の指数部の「０」から被乗数リーディングゼロカウント値Ｐ１の「１」を減算し、０−１＝−１で表される。乗数の正規化指数部の「−２」は、乗数の指数部の「０」から乗数リーディングゼロカウント値Ｐ２の「２」を減算し、０−２＝−２で表される。積の仮数部の「１．２２１０００００００」は、被乗数の正規化仮数部の「１．１００００」に対して乗数の正規化仮数部の「１．１００００」を乗算した積である。積の指数部の「−３」は、被乗数の正規化指数部の「−１」と乗数の正規化指数部の「−２」とを加算し、（−１）＋（−２）＝−３で表される。その右隣の値Ｐの「３」は、Ｐ１＋Ｐ２＝１＋２＝３で表される。積の仮数部の「０．００１２２１００００」は、積の仮数部の「１．２２１０００００００」を値Ｐの「３」だけ右シフトした値である。その右隣の指数部の「０」は、その上の指数部の「−３」と値Ｐの「３」を加算し、−３＋３＝０で表される。積の仮数部の固定精度は６桁であるため、積の仮数部の「０．００１２２１００００」の上位６桁の「０．００１２２」を積の仮数部にしようとすると、桁落ちが発生し、精度が悪化してしまう。そこで、左シフト回路により、積の仮数部の「０．００１２２１００００」を１桁左シフトし、積の指数部の「０」から「１」を減算して「−１」の指数部とし、積の出力ＯＵＴ３を出力する。積の出力ＯＵＴ３は、「０．０１２２１」の仮数部と、「−１」の指数部とを有する。これにより、桁落ちを防止し、精度を向上させることができる。しかし、左シフト回路を追加する必要があるため、物量及び遅延時間が増加してしまう課題がある。
【００１２】
図４は、第１の実施形態による第１の乗算方法を説明するための図である。第１の乗算方法では、非正規化固定精度浮動小数点数の乗算を行う。被乗数、乗数及び積の仮数部の固定精度の桁数ｍは、例えば６桁である。被乗数は、「０００１１０」の仮数部及び「０」の指数部を有する。乗数は、「００００１１」の仮数部及び「０」の指数部を有する。被乗数リーディングゼロカウント値ＬＺＣ１は、被乗数の仮数部の「０００１１０」の上位に連続するゼロの数であり、「３」である。乗数リーディングゼロカウント値ＬＺＣ２は、乗数の仮数部の「００００１１」の上位に連続するゼロの数であり、「４」である。シフト量ＬＳＡの「１」は、ｍ−ＬＺＣ２−１＝６−４−１＝１で表される。このシフト量ＬＳＡは、図３の最後の左シフト回路のシフト量に対応する。
【００１３】
シフト後の被乗数の仮数部の「００１１００」は、被乗数の仮数部の「０００１１０」をシフト量ＬＳＡの「１」だけ左シフトした数である。乗数の仮数部の桁数ＤＣは、ｍ−ＬＺＣ２＝６−４＝２で表される。積の指数部の「０」は、被乗数の指数部の「０」と乗数の指数部の「０」とを加算した値である。
【００１４】
次に、シフト後の被乗数の仮数部の「００１１００」に対して乗数の仮数部の「００００１１」の下位１桁目の「１」を乗算し、１桁右シフトすることにより、仮数部の部分積の「００１１０．０」が得られる。乗数の仮数部の桁数ＤＣは、デクリメントされ、「２」から「１」になる。
【００１５】
次に、シフト後の被乗数の仮数部の「００１１００」に対して乗数の仮数部の「００００１１」の下位２桁目の「１」を乗算することにより、仮数部の部分積の「００１１００」が得られる。乗数の仮数部の桁数ＤＣは、デクリメントされ、「１」から「０」になる。
【００１６】
乗数の仮数部の桁数ＤＣが「０」になると、下位１桁目の部分積の「００１１０．０」と下位２桁目の部分積の「００１１００」とが加算され、中間積の「００１２１０．０」が得られる。積の指数部は、「０」のままである。
【００１７】
次に、中間積の「００１２１０．０」のうちの固定精度の６桁の「００１２１０」が積の出力ＯＵＴ４として出力される。積の出力ＯＵＴ４は、「００１２１０」の仮数部と、「０」の指数部とを有する。これにより、桁落ちがなく、高精度の積が得られる。また、図３のように、ｍ×２＝６×２＝１２桁のシフト回路又はレジスタが必要ないので、物量及び遅延時間を低減することができる。
【００１８】
図５は、第１の実施形態による第２の乗算方法を説明するための図である。第２の乗算方法では、非正規化固定精度浮動小数点数の乗算を行う。図４の第１の乗算方法では、最終の積の出力ＯＵＴ４の仮数部の最上位桁が０の場合を示したが、図５の第２の乗算方法では、最終の積の出力ＯＵＴ５の仮数部の最上位桁が１〜９になる場合を示す。被乗数は、「０１１１００」の仮数部及び「０」の指数部を有する。乗数は、「００００１１」の仮数部及び「０」の指数部を有する。被乗数リーディングゼロカウント値ＬＺＣ１は、被乗数の仮数部の「０１１１００」の上位に連続するゼロの数であり、「１」である。乗数リーディングゼロカウント値ＬＺＣ２は、乗数の仮数部の「００００１１」の上位に連続するゼロの数であり、「４」である。シフト量ＬＳＡの「１」は、ｍ−ＬＺＣ２−１＝６−４−１＝１で表される。
【００１９】
シフト後の被乗数の仮数部の「１１１０００」は、被乗数の仮数部の「０１１１００」をシフト量ＬＳＡの「１」だけ左シフトした数である。乗数の仮数部の桁数ＤＣは、ｍ−ＬＺＣ２＝６−４＝２で表される。積の指数部の「０」は、被乗数の指数部の「０」と乗数の指数部の「０」とを加算した値である。
【００２０】
次に、シフト後の被乗数の仮数部の「１１１０００」に対して乗数の仮数部の「００００１１」の下位１桁目の「１」を乗算し、１桁右シフトすることにより、仮数部の部分積の「１１１００．０」が得られる。乗数の仮数部の桁数ＤＣは、デクリメントされ、「２」から「１」になる。
【００２１】
次に、シフト後の被乗数の仮数部の「１１１０００」に対して乗数の仮数部の「００００１１」の下位２桁目の「１」を乗算することにより、仮数部の部分積の「１１１０００」が得られる。乗数の仮数部の桁数ＤＣは、デクリメントされ、「１」から「０」になる。
【００２２】
乗数の仮数部の桁数ＤＣが「０」になると、下位１桁目の部分積の「１１１００．０」と下位２桁目の部分積の「１１１０００」とが加算され、中間積の「１２２１００．０」が得られる。積の指数部は、「０」のままである。
【００２３】
次に、中間積の「１２２１００．０」のうちの固定精度の６桁の「１２２１００」が積の出力ＯＵＴ５として出力される。積の出力ＯＵＴ５は、「１２２１００」の仮数部と、「０」の指数部とを有する。これにより、桁落ちがなく、高精度の積が得られる。
【００２４】
図６は、第１の実施形態による第３の乗算方法を説明するための図である。第３の乗算方法では、乗数の仮数部の桁数が被乗数の仮数部の桁数より多い場合の非正規化固定精度浮動小数点数の乗算を行う方法を示す。被乗数は、「００００１１」の仮数部及び「０」の指数部を有する。乗数は、「０１１１００」の仮数部及び「０」の指数部を有する。被乗数リーディングゼロカウント値ＬＺＣ１は、被乗数の仮数部の「００００１１」の上位に連続するゼロの数であり、「４」である。乗数リーディングゼロカウント値ＬＺＣ２は、乗数の仮数部の「０１１１００」の上位に連続するゼロの数であり、「１」である。シフト量ＬＳＡの「１」は、ｍ−ＬＺＣ２−１＝６−１−１＝４で表される。
【００２５】
シフト後の被乗数の仮数部の「１１００００」は、被乗数の仮数部の「００００１１」をシフト量ＬＳＡの「４」だけ左シフトした数である。乗数の仮数部の桁数ＤＣは、ｍ−ＬＺＣ２＝６−１＝５で表される。積の指数部の「０」は、被乗数の指数部の「０」と乗数の指数部の「０」とを加算した値である。
【００２６】
次に、シフト後の被乗数の仮数部の「１１００００」に対して乗数の仮数部の「０１１１００」の下位１桁目の「０」を乗算し、４桁右シフトすることにより、仮数部の部分積の「００．００００」が得られる。乗数の仮数部の桁数ＤＣは、デクリメントされ、「５」から「４」になる。
【００２７】
次に、シフト後の被乗数の仮数部の「１１００００」に対して乗数の仮数部の「０１１１００」の下位２桁目の「０」を乗算し、３桁右シフトすることにより、仮数部の部分積の「０００．０００」が得られる。乗数の仮数部の桁数ＤＣは、デクリメントされ、「４」から「３」になる。
【００２８】
次に、シフト後の被乗数の仮数部の「１１００００」に対して乗数の仮数部の「０１１１００」の下位３桁目の「１」を乗算し、２桁右シフトすることにより、仮数部の部分積の「１１００．００」が得られる。乗数の仮数部の桁数ＤＣは、デクリメントされ、「３」から「２」になる。
【００２９】
次に、シフト後の被乗数の仮数部の「１１００００」に対して乗数の仮数部の「０１１１００」の下位４桁目の「１」を乗算し、１桁右シフトすることにより、仮数部の部分積の「１１０００．０」が得られる。乗数の仮数部の桁数ＤＣは、デクリメントされ、「２」から「１」になる。
【００３０】
次に、シフト後の被乗数の仮数部の「１１００００」に対して乗数の仮数部の「０１１１００」の下位５桁目の「１」を乗算することにより、仮数部の部分積の「１１００００」が得られる。乗数の仮数部の桁数ＤＣは、デクリメントされ、「１」から「０」になる。
【００３１】
乗数の仮数部の桁数ＤＣが「０」になると、上記の下位１桁目〜５桁目の５個の部分積が加算され、中間積の「１２２１００．０」が得られる。積の指数部は、「０」のままである。
【００３２】
次に、中間積の「１２２１００．０」のうちの固定精度の６桁の「１２２１００」が積の出力ＯＵＴ６として出力される。積の出力ＯＵＴ６は、「１２２１００」の仮数部と、「０」の指数部とを有する。これにより、桁落ちがなく、高精度の積が得られる。
【００３３】
図７は、第１の実施形態による第４の乗算方法を説明するための図である。第４の乗算方法では、中間積が桁あふれする場合の非正規化固定精度浮動小数点数の乗算を行う方法を示す。被乗数は、「０９９９００」の仮数部及び「０」の指数部を有する。乗数は、「００００９９」の仮数部及び「０」の指数部を有する。被乗数リーディングゼロカウント値ＬＺＣ１は、被乗数の仮数部の「０９９９００」の上位に連続するゼロの数であり、「１」である。乗数リーディングゼロカウント値ＬＺＣ２は、乗数の仮数部の「００００９９」の上位に連続するゼロの数であり、「４」である。シフト量ＬＳＡの「１」は、ｍ−ＬＺＣ２−１＝６−４−１＝１で表される。
【００３４】
シフト後の被乗数の仮数部の「９９９０００」は、被乗数の仮数部の「０９９９００」をシフト量ＬＳＡの「１」だけ左シフトした数である。乗数の仮数部の桁数ＤＣは、ｍ−ＬＺＣ２＝６−４＝２で表される。積の指数部の「０」は、被乗数の指数部の「０」と乗数の指数部の「０」とを加算した値である。
【００３５】
次に、シフト後の被乗数の仮数部の「９９９０００」に対して乗数の仮数部の「００００９９」の下位１桁目の「９」を乗算し、１桁右シフトすることにより、仮数部の部分積の「８９９１００．０」が得られる。乗数の仮数部の桁数ＤＣは、デクリメントされ、「２」から「１」になる。
【００３６】
次に、シフト後の被乗数の仮数部の「９９９０００」に対して乗数の仮数部の「００００９９」の下位２桁目の「９」を乗算することにより、仮数部の部分積の「８９９１０００」が得られる。乗数の仮数部の桁数ＤＣは、デクリメントされ、「１」から「０」になる。
【００３７】
乗数の仮数部の桁数ＤＣが「０」になると、下位１桁目の部分積の「８９９１００．０」と下位２桁目の部分積の「８９９１０００」とが加算され、中間積の「９８９０１００．０」が得られる。積の指数部は、「０」のままである。ここで、中間積の「９８９０１００．０」の整数部は７桁であり、固定精度の桁数ｍ＝６を超え、桁あふれ状態である。
【００３８】
次に、中間積の「９８９０１００．０」の整数部の下位７桁目の「９」が「１〜９」であるので、桁あふれ状態であると判断する。その場合、中間積の「９８９０１００．０」を１桁右シフトし、積の指数部をインクリメントして「０」から「１」にし、積の出力ＯＵＴ７を出力する。積の出力ＯＵＴ７は、「９８９０１０」の仮数部と、「１」の指数部とを有する。これにより、桁あふれを防止し、高精度の積が得られる。
【００３９】
図８は、第１の実施形態による第５の乗算方法を説明するための図である。第５の乗算方法では、シフト量ＬＳＡが被乗数リーディングゼロカウント値ＬＺＣ１より大きくなる場合の非正規化固定精度浮動小数点数の乗算を行う方法を示す。被乗数は、「０１１１１１」の仮数部及び「０」の指数部ｅｘｐ１を有する。乗数は、「０００１１１」の仮数部及び「０」の指数部ｅｘｐ２を有する。被乗数リーディングゼロカウント値ＬＺＣ１は、被乗数の仮数部の「０１１１１１」の上位に連続するゼロの数であり、「１」である。乗数リーディングゼロカウント値ＬＺＣ２は、乗数の仮数部の「０００１１１」の上位に連続するゼロの数であり、「３」である。シフト量ＬＳＡの「２」は、ｍ−ＬＺＣ２−１＝６−３−１＝２で表される。
【００４０】
ここで、シフト量ＬＳＡの「２」は、被乗数リーディングゼロカウント値ＬＺＣ１の「１」より大きいため、被乗数の仮数部の「０１１１１１」をシフト量ＬＳＡの「２」だけ左シフトすることができない。この場合、被乗数の仮数部の「０１１１１１」を被乗数リーディングゼロカウント値ＬＺＣ１の「１」だけ左シフトし、シフト後の被乗数の仮数部の「１１１１１０」を得る。乗数の仮数部の桁数ＤＣは、ｍ−ＬＺＣ２＝６−３＝３で表される。積の指数部の「１」は、補正により、ｅｘｐ１＋ｅｘｐ２＋ＬＳＡ−ＬＺＣ１＝０＋０＋２−１＝１で表される。
【００４１】
次に、シフト後の被乗数の仮数部の「１１１１１０」に対して乗数の仮数部の「０００１１１」の下位１桁目の「１」を乗算し、２桁右シフトすることにより、仮数部の部分積の「１１１１．１０」が得られる。乗数の仮数部の桁数ＤＣは、デクリメントされ、「３」から「２」になる。
【００４２】
次に、シフト後の被乗数の仮数部の「１１１１１０」に対して乗数の仮数部の「０００１１１」の下位２桁目の「１」を乗算し、１桁右シフトすることにより、仮数部の部分積の「１１１１１．０」が得られる。乗数の仮数部の桁数ＤＣは、デクリメントされ、「２」から「１」になる。
【００４３】
次に、シフト後の被乗数の仮数部の「１１１１１０」に対して乗数の仮数部の「０００１１１」の下位３桁目の「１」を乗算することにより、仮数部の部分積の「１１１１１０」が得られる。乗数の仮数部の桁数ＤＣは、デクリメントされ、「１」から「０」になる。
【００４４】
乗数の仮数部の桁数ＤＣが「０」になると、上記の下位１桁目〜３桁目の部分積が加算され、中間積の「１２３３３２．１」が得られる。積の指数部は、「１」のままである。この状態で、積の出力ＯＵＴ８が出力される。積の出力ＯＵＴ８は、仮数部の整数部の「１２３３３２」及び小数部の「．１」と、指数部の「１」とを有する。この後、積の仮数部は、例えば小数部が四捨五入され、「１２３３３２」の仮数部と、「１」の指数部とが出力される。上記のように、左シフト量及び指数部を補正することにより、高精度の積が得られる。
【００４５】
図９は、第１の実施形態による乗算装置の構成例を示す図である。この乗算装置は、上記の図４〜図８の乗算を行うことができる。被乗数となる浮動小数点数は、正負符号ｓｇ１と、仮数部ｓｆ１と、指数部ｅｘｐ１とを有し、１０進数の場合には、（−１）sg1×ｓｆ１×１０exp1で表される。乗数となる浮動小数点数は、正負符号ｓｇ２と、仮数部ｓｆ２と、指数部ｅｘｐ２とを有し、１０進数の場合には、（−１）sg2×ｓｆ２×１０exp2で表される。正負符号ｓｇ１及びｓｇ２は、「０」が正を表し、「１」が負を表す。
【００４６】
排他的論理和回路９０１は、正負符号演算回路であり、被乗数の正負符号ｓｇ１と乗数の正負符号ｓｇ２との排他的論理和値を正負符号ｓｇ０として出力する。すなわち、排他的論理和回路９０１は、被乗数となる浮動小数点数の正負符号ｓｇ１及び乗数となる浮動小数点数の正負符号ｓｇ２を入力し、両者の正負符号が同じであれば、積の浮動小数点数の正負符号ｓｇ０を正（値「０」）として出力し、両者の正負符号が異なれば、積の浮動小数点数の正負符号ｓｇ０を負（値「１」）として出力する。レジスタ９１９は、正負符号ｓｇ０を保持し、その正負符号ｓｇ０を積の浮動小数点数の正負符号ｓｇとして出力する。
【００４７】
加算回路９０２は、被乗数となる浮動小数点数の指数部ｅｘｐ１と乗数となる浮動小数点の指数部ｅｘｐ２とを加算した値ｅｘｐ０（＝ｅｘｐ１＋ｅｘｐ２）を出力する。
【００４８】
被乗数リーディングゼロカウント回路９０３は、被乗数となる浮動小数点数の仮数部ｓｆ１の上位に連続するゼロの数を被乗数リーディングゼロカウント値ＬＺＣ１としてカウントする。乗数リーディングゼロカウント回路９０４は、乗数となる浮動小数点数の仮数部ｓｆ２の上位に連続するゼロの数を乗数リーディングゼロカウント値ＬＺＣ２としてカウントする。
【００４９】
減算回路９０６は、シフト量演算回路であり、「１５」−ＬＺＣ２を演算し、シフト量ＬＳＡを出力する。具体的には、減算回路９０６は、次式のように、仮数部ｓｆ１及びｓｆ２の固定精度の桁数ｍに対して乗数リーディングゼロカウント値ＬＺＣ２を減算して１を減算することによりシフト量ＬＳＡを演算する。ここで、ｍは、例えば１６である。
【００５０】
ＬＳＡ＝ｍ−ＬＺＣ２−１
＝１６−ＬＺＣ２−１
＝１５−ＬＺＣ２
【００５１】
減算回路９０８は、シフト量ＬＳＡから被乗算リーディングゼロカウント値ＬＺＣ１を減算し、ＬＳＡ−ＬＺＣ１を出力すると共に、キャリーアウトｃｏを出力する。キャリーアウトｃｏは、ＬＳＡ−ＬＺＣ１がゼロ以上である場合には「１」になり、ＬＳＡ−ＬＺＣ１が負値である場合には「０」になる。
【００５２】
加算回路９０９は、減算回路９０８の出力値「ＬＳＡ−ＬＺＣ１」と値ｅｘｐ０とを加算し、ｅｘｐ０＋ＬＳＡ−ＬＺＣ１を出力する。セレクタ９１０は、キャリーアウトｃｏが「１」である場合には、値ｅｘｐ０を選択して出力し、キャリーアウトｃｏが「０」である場合（例えば図８の場合）には、値ｅｘｐ０＋ＬＳＡ−ＬＺＣ１を選択して出力する。
【００５３】
インクリメント回路９１１は、レジスタ９２０の出力値ｅｘｐをインクリメントし、値ｅｘｐ＋１を出力する。セレクタ９１２は、初回の中間積の乗算では、セレクタ９１０の出力値を選択して出力し、２回目以降の中間積の乗算では、インクリメント回路９１１の出力値を選択して出力する。レジスタ９２０の値は、制御回路９１８が出力する補正信号ｅｘｔ等に応じて、セレクタ９１２の出力値に更新され、積の浮動小数点数の指数部ｅｘｐとして出力される。
【００５４】
インクリメント回路９１３は、次式のように、シフト量ＬＳＡをインクリメントし、乗数の仮数部ｓｆ２の桁数ＤＣを出力する。
【００５５】
ＤＣ＝ＬＳＡ＋１
＝（１５−ＬＺＣ２）＋１
＝（ｍ−ＬＺＣ２−１）＋１
＝ｍ−ＬＺＣ２
【００５６】
上記のように、減算回路９０６及びインクリメント回路９１３は、桁数演算回路であり、仮数部の固定精度の桁数ｍから乗数リーディングゼロカウント値ＬＺＣ２を減算することにより乗数の仮数部の桁数ＤＣを演算する。
【００５７】
デクリメント回路９１４は、レジスタ９２１の出力値ＤＣ０をデクリメントし、値ＤＣ０−１を出力する。セレクタ９２５は、初回の中間積の乗算では、乗数の仮数部ｓｆ２の桁数ＤＣを選択して出力し、２回目以降の中間積の乗算では、デクリメント回路９１４の出力値を選択して出力する。レジスタ９２１の値は、後述する条件で、セレクタ９２５の出力値に更新され、値ＤＣ０として出力される。
【００５８】
セレクタ９０７は、キャリーアウトｃｏが「１」である場合には、シフト量ＬＳＡを選択して出力し、キャリーアウトｃｏが「０」である場合（例えば図８の場合）には、被乗算リーディングゼロカウント値ＬＺＣ１を選択して出力する。
【００５９】
左シフト回路９０５は、セレクタ９０７の出力値だけ被乗数の仮数部ｓｆ１を左シフトし、被乗数の仮数部ｓｆｔ１を出力する。
【００６０】
乗算ループ回路（乗算回路）９１５は、ｒレジスタ９２２が出力する中間積ｒ、被乗数の仮数部ｓｆｔ１、乗数の仮数部ｓｆ２及び補正信号ｅｘｔを入力し、乗数の仮数部ｓｆ２の桁単位で、中間積Ａ１及び最下位桁Ａ２を出力する。
【００６１】
図１０は、図９の乗算ループ回路９１５の構成例を示す図である。以下、乗算ループ回路９１５の一例を示すが、種々の構成を採用することができる。セレクタ１００１は、初回の中間積の乗算では、乗数の仮数部ｓｆ２を選択して出力し、２回目以降の中間積の乗数では、右シフト回路１００７の出力値を選択して出力する。レジスタ１００３の値は、中間積の乗算毎に、セレクタ１００１の出力値に更新され、乗数の仮数部ＳＦＴ２として出力される。右シフト回路１００７は、乗数の仮数部ＳＦＴ２を１桁右シフトして、セレクタ１００１に出力する。レジスタ１００２は、被乗数の仮数部ｓｆｔ１を記憶し、仮数部ｓｆｔ１を出力する。積生成セレクト回路１００５は、被乗数の仮数部ｓｆｔ１の０倍から９倍までの倍数値を生成し、レジスタ１００３に記憶される乗数の仮数部ＳＦＴ２の最下位桁（４ビット）及び補正信号ｅｘｔに応じて、上記の倍数値を選択して部分積Ａ３として出力する。
【００６２】
図１１は、図１０の積生成セレクト回路１００５の入出力の対応関係を示す図である。入力値ＳＴＦ２［３：０］は、乗数の仮数部ＳＦＴ２の最下位桁（４ビット）を示す。補正信号ｅｘｔが「０」である場合、入力値ＳＴＦ２［３：０］が「０」〜「９」である場合には、それぞれ、部分積Ａ３は被乗数の仮数部ｓｆｔ１の「０」倍〜「９」倍の倍数値として出力される。また、補正信号ｅｘｔが「１」である場合、部分積Ａ３は被乗数の仮数部ｓｆｔ１の「０」倍として出力される。
【００６３】
図１０において、中間積ｒの最下位桁（４ビット）は、最下位桁Ａ２として出力される。右シフト回路１００４は、中間積ｒを１桁右シフトして出力する。加算回路１００６は、右シフト回路１００４の出力値と部分積Ａ３とを加算し、中間積Ａ１を出力する。ここで、積生成セレクト回路１００５は、固定精度の桁数ｍより１桁多い精度の値を出力する。加算回路１００６も、固定精度の桁数ｍより１桁多い精度の値を入出力する。
【００６４】
図９において、ｒレジスタ９２２には、乗算ループ回路９１５の中間積Ａ１が入力される。ｒレジスタ９２２は、固定精度の桁数ｍより１桁多い精度の中間積ｒを記憶し、中間積ｒを乗算ループ回路９１５及び丸め処理回路９１７に出力する。
【００６５】
ｇレジスタ９２３には、乗算ループ回路９１５の最下位桁Ａ２が入力される。ｇレジスタ９２３は、最下位桁ｇを記憶し、最下位桁ｇを丸め処理回路９１７及び論理和（ＯＲ）回路９１６に出力する。
【００６６】
論理和回路９１６は、最下位桁（４ビット）ｇのビット論理和値を出力する。すなわち、論理和回路９１６は、最下位桁ｇが「０」の場合には「０」を出力し、最下位桁ｇが「１」〜「９」の場合には「１」を出力する。ｓレジスタ９２４には、論理和回路９１６の出力値が入力される。ｓレジスタ９２４は、丸め処理用のスティッキービットｓを記憶し、スティッキービットｓを丸め処理回路９１７に出力する。
【００６７】
ｒレジスタ９２２には、中間積の仮数部の整数部が記憶される。ｇレジスタ９２３には、中間積の仮数部の小数第一位の桁が記憶される。ｓレジスタ９２４には、中間積の仮数部の小数第二位のスティッキービットが記憶される。
【００６８】
図１２（Ａ）〜（Ｄ）は、図９の制御回路９１８の制御方法を示す図である。制御回路９１８は、レジスタ９２１の出力値ＤＣ０と、ｒレジスタ９２２の最上位桁（ｍ＋１桁目）とを入力し、補正信号ｅｘｔを出力する。
【００６９】
図１２（Ａ）は、制御回路９１８が乗算ループ終了条件を満たすか否かの判定方法を示す図である。値ＤＣ０が０以下である場合に、制御回路９１８は、乗算ループ終了条件を満たすと判定する。
【００７０】
図１２（Ｂ）は、制御回路９１８が出力する補正信号ｅｘｔを説明するための図である。図１２（Ａ）の乗算ループ終了条件を満たし、かつ中間積ｒの最上位桁が「１」〜「９」である場合には、制御回路９１８は「１」の補正信号ｅｘｔを出力し、それ以外の場合には、制御回路９１８は「０」の補正信号ｅｘｔを出力する。例えば、図７の場合、７桁の中間積の「９８９０１００」の最上位桁が「９」であるので、「１」の補正信号ｅｘｔが出力される。補正信号ｅｘｔが「１」になると、図７に示したように、レジスタ９２０の値は、指数部ｅｘｐがインクリメントされた指数部ｅｘｐ＋１に更新され、レジスタ９２２は、中間積ｒを１桁右シフトして出力する。
【００７１】
図１２（Ｃ）は、レジスタ９１９〜９２４の更新停止条件を示す図である。正負符号ｓｇのレジスタ９１９は、初回の中間積の乗算の時に更新され、２回目以降の中間積の乗算の時には更新が停止される。指数部ｅｘｐのレジスタ９２０は、値ＤＣ０がゼロ以上、かつ補正信号ｅｘｔが「０」の場合に、更新が停止される。値ＤＣ０のレジスタ９２１、ｒレジスタ９２２、ｇレジスタ９２３及びｓレジスタ９２４は、乗数の仮数部の桁単位の中間積が算出される毎に更新される。レジスタ９１９〜９２４は、上記の更新停止条件を満たさない場合には更新される。
【００７２】
図１２（Ｄ）は、丸め処理回路９１７の処理例を示す図である。制御回路９１８は、丸めモードに応じて、丸め処理回路９１７を制御する。丸め処理回路９１７は、レジスタ９１９の正負符号ｓｇと、ｒレジスタ９２２の中間積ｒと、ｇレジスタ９２３の小数第一位桁ｇと、ｓレジスタ９２４のスティッキービットｓとを入力し、丸め処理を行い、積の浮動小数点数の仮数部ｓｆを出力する。
【００７３】
まず、丸めモードが「０」の場合を説明する。この丸めモードでは、丸め処理回路９１７は、銀行家丸めと呼ばれている丸め処理を行う。ｒレジスタ９２２の中間積ｒの最下位ビットが「１」である場合（中間積が奇数である場合）、ｇレジスタ９２３の小数第一位桁ｇが「５」であり、かつｓレジスタ９２４のスティッキービットｓが「０」である場合には、ｒレジスタ９２２の下位ｍ桁の中間積に１を加算し、積の仮数部ｓｆを出力する。例えば、「３．５」は、丸め処理により「４」になる。また、ｇレジスタ９２３の小数第一位桁ｇが「５」であり、かつｓレジスタ９２４のスティッキービットｓが「１」である場合には、丸め処理回路９１７は、ｒレジスタ９２２の下位ｍ桁の中間積に１を加算し、積の仮数部ｓｆを出力する。例えば、「２．５１」は、丸め処理により「３」になる。また、ｇレジスタ９２３の小数第一位桁ｇが「６」〜「９」である場合には、ｒレジスタ９２２の下位ｍ桁の中間積に１を加算し、積の仮数部ｓｆを出力する。例えば、「２．６」は、丸め処理により「３」になる。
【００７４】
次に、丸めモードが「１」の場合を説明する。この丸めモードでは、丸め処理回路９１７は、切り捨ての丸め処理を行う。丸め処理回路９１７は、ｒレジスタ９２２の下位ｍ桁の中間積をそのまま仮数部ｓｆとして出力する。
【００７５】
次に、丸めモードが「２」の場合を説明する。この丸めモードでは、丸め処理回路９１７は、＋∞の方向に丸め処理を行う。正負符号ｓｇが「０」であり、かつｇレジスタ９２３の小数第一位桁ｇが「１」〜「９」の場合には、丸め処理回路９１７は、ｒレジスタ９２２の下位ｍ桁の中間積に１を加算し、積の仮数部ｓｆを出力する。また、正負符号ｓｇが「０」であり、かつｓレジスタ９２４のスティッキービットｓが「１」の場合には、丸め処理回路９１７は、ｒレジスタ９２２の下位ｍ桁の中間積に１を加算し、積の仮数部ｓｆを出力する。
【００７６】
次に、丸めモードが「３」の場合を説明する。この丸めモードでは、丸め処理回路９１７は、−∞の方向に丸め処理を行う。正負符号ｓｇが「１」であり、かつｇレジスタ９２３の小数第一位桁ｇが「１」〜「９」の場合には、丸め処理回路９１７は、ｒレジスタ９２２の下位ｍ桁の中間積に１を加算し、積の仮数部ｓｆを出力する。また、正負符号ｓｇが「１」であり、かつｓレジスタ９２４のスティッキービットｓが「１」の場合には、丸め処理回路９１７は、ｒレジスタ９２２の下位ｍ桁の中間積に１を加算し、積の仮数部ｓｆを出力する。
【００７７】
次に、丸めモードが「４」の場合を説明する。この丸めモードでは、丸め処理回路９１７は、四捨五入の丸め処理を行う。ｇレジスタ９２３の小数第一位桁ｇが「５」〜「９」の場合には、丸め処理回路９１７は、ｒレジスタ９２２の下位ｍ桁の中間積に１を加算し、積の仮数部ｓｆを出力する。
【００７８】
なお、丸め処理が必要ない場合、ｇレジスタ９２３及びｓレジスタ９２４の更新処理をスキップし、丸め処理回路９１７は、丸め処理を行わずに、ｒレジスタ９２２の下位ｍ桁の中間積を仮数部ｓｆとして出力してもよい。
【００７９】
以上の処理により、乗算装置は、正負符号ｓｇと、指数部ｅｘｐと、仮数部ｓｆとを含む浮動小数点数の積を出力する。
【００８０】
図４〜図６の場合、制御回路９１８は、乗算ループ回路９１５が出力する中間積Ａ１の回数が乗数の仮数部ｓｆ２の桁数ＤＣになった場合には、乗算ループ回路９１５が出力する中間積Ａ１を積の浮動小数点数の仮数部ｓｆとして出力し、加算回路９０２により出力された値ｅｘｐ０を積の浮動小数点数の指数部ｅｘｐとして出力する。
【００８１】
また、図７の場合、制御回路９１８は、乗算ループ回路９１５が出力する中間積Ａ１の回数が乗数の仮数部ｓｆ２の桁数ＤＣになり、かつ乗算ループ回路９１５が出力する中間積Ａ１の桁数が積の固定精度の桁数ｍを超える場合には、乗算ループ回路９１５が出力する中間積Ａ１を１桁右シフトした値を積の浮動小数点数の仮数部ｓｆとして出力し、加算回路９０２により出力された値ｅｘｐ０をインクリメントした値を積の浮動小数点数の指数部ｅｘｐとして出力する。
【００８２】
また、図８の場合、減算回路９０８及び加算回路９０９は、指数部補正回路であり、加算回路９０２により出力された値ｅｘｐ０に対してシフト量ＬＳＡを加算して被乗数リーディングゼロカウント値ＬＺＣ１を減算した値をセレクタ９１０に出力する。左シフト回路９０５は、シフト量ＬＳＡが被乗数リーディングゼロカウント値ＬＺＣ１より大きい場合（キャリーアウトｃｏが「０」の場合）には、被乗数リーディングゼロカウント値ＬＺＣ１だけ被乗数の仮数部ｓｆ１を左シフトする。制御回路９１８は、シフト量ＬＳＡが被乗数リーディングゼロカウント値ＬＺＣ１より大きい場合（キャリーアウトｃｏが「０」の場合）には、加算回路９０９により出力された値を積の浮動小数点数の指数部ｅｘｐとして出力する。
【００８３】
また、制御回路９１８は、乗算ループ回路９１５が出力する中間積Ａ１の回数が乗数の仮数部ｓｆ２の桁数ＤＣになり、かつ乗算ループ回路９１５が出力する中間積Ａ１の桁数が積の固定精度の桁数ｍを超える場合には、乗算ループ回路９１５が出力する中間積Ａ１を１桁右シフトした値を積の浮動小数点数の仮数部ｓｆとして出力し、加算回路９０９により出力された値をインクリメントした値を積の浮動小数点数の指数部ｓｆとして出力する。
【００８４】
また、丸め処理回路９１７は、乗算ループ回路９１５が出力する中間積Ａ１の回数が乗数の仮数部ｓｆ２の桁数ＤＣになり、かつ乗算ループ回路９１５が出力する中間積の桁数が積の固定精度の桁数ｍを超える場合には、乗算ループ回路９１５が出力する中間積に対して丸め処理を行い、その丸め処理した中間積を積の浮動小数点数の仮数部ｓｆとして出力する。
【００８５】
本実施形態によれば、非正規化固定精度浮動小数点数の乗算を行うことができる。また、図２のような桁落ちがなく、高精度の積が得られる。また、図３のように、ｍ×２桁のシフト回路又はレジスタが必要ないので、物量及び遅延時間を低減することができる。また、乗算ループ回路９１５の中間積の算出のアルゴリズムは問わないので、既存の乗算ループ回路９１５を利用することが可能である。
【００８６】
（第２の実施形態）
図１３は、第２の実施形態による乗算装置の構成例を示す図である。図１３の乗算装置は、図９の乗算装置に対して、セレクタ１３０１、デクリメント回路１３０２及びレジスタ１３０３を追加したものである。以下、本実施形態が第１の実施形態と異なる点を説明する。
【００８７】
本実施形態は、６４ビットのＩＥＥＥ７５４−２００８の浮動小数点１０進数形式を入出力フォーマットとした固定レイテンシ乗算装置である。レジスタ１３０３は、カウント値ＬＣを保持する。デクリメント回路１３０２は、レジスタ１３０３のカウント値ＬＣをデクリメントし、ＬＣ−１を出力する。セレクタ１３０１には、仮数部ｓｆ１及びｓｆ２の桁数ｍ（例えば「１６」）が入力される。桁数「１６」は、固定レイテンシのカウント値である。セレクタ１３０１は、初回の中間積の乗算では、初期値「１６」を選択して出力し、２回目以降の中間積の乗算では、デクリメント回路１３０２の出力値を選択して出力する。レジスタ１３０３は、セレクタ１３０１の出力値を保持する。レジスタ１３０３のカウント値ＬＣは、制御回路９１８に出力される。制御回路９１８は、レジスタ９２１の出力値ＤＣ０と、ｒレジスタ９２２の最上位桁と、レジスタ１３０３のカウント値ＬＣとを入力し、補正信号ｅｘｔ及びレジスタ更新停止信号ｓｔｐを出力する。
【００８８】
図１４（Ａ）〜（Ｄ）は、図１３の制御回路９１８の制御方法を示す図である。図１４（Ａ）は、制御回路９１８が乗算ループ終了条件を満たすか否かの判定方法を示す図である。レジスタ１３０３のカウント値ＬＣが０以下である場合には、制御回路９１８は、乗算ループ終了条件を満たすと判定する。
【００８９】
図１４（Ｂ）は、制御回路９１８が出力するレジスタ更新停止信号ｓｔｐを説明するための図である。値ＤＣ０が０以下であり、かつ補正信号ｅｘｔが「０」である場合に、制御回路９１８は、「１」のレジスタ更新停止信号ｓｔｐを出力する。レジスタ更新停止信号ｓｔｐが「１」になると、レジスタ９２０及び９２２の値の更新が停止される。
【００９０】
図１４（Ｃ）は、制御回路９１８が出力する補正信号ｅｘｔを説明するための図である。図１４（Ａ）の乗算ループ終了条件を満たし、ｒレジスタ９２２の最上位桁が「１」〜「９」である場合（図７の場合）には、制御回路９１８は「１」の補正信号ｅｘｔを出力し、それ以外の場合には、制御回路９１８は「０」の補正信号ｅｘｔを出力する。
【００９１】
図１４（Ｄ）は、レジスタ９１９〜９２４，１３０３の更新停止条件を示す図である。レジスタ９１９〜９２４は、図１２（Ｃ）の更新停止条件と同様である。カウント値ＬＣのレジスタ１３０３は、乗数の仮数部の桁単位の中間積が算出される毎に更新される。
【００９２】
以上のように、制御回路９１８は、固定レイテンシのカウント値ＬＣ（初期値が「１６」）をカウント後に、積の浮動小数点数の正負符号ｓｇ、仮数部ｓｆ及び指数部ｅｘｐを出力する。第１の実施形態の乗算装置は、被乗数及び乗数を入力してから積を出力するまでの時間が、被乗数及び乗数に応じて可変となる可変レイテンシである。これに対し、本実施形態の乗算装置は、被乗数及び乗数によらず、被乗数及び乗数を入力してから積を出力するまでの時間が一定となる固定レイテンシである。これにより、乗算装置の後段の回路の処理が容易になる。
【００９３】
なお、第１及び第２の実施形態では、１０進数の場合を例に説明したが、１０進数に限定されない。
【００９４】
上記実施形態は、何れも本発明を実施するにあたっての具体化の例を示したものに過ぎず、これらによって本発明の技術的範囲が限定的に解釈されてはならないものである。すなわち、本発明はその技術思想、又はその主要な特徴から逸脱することなく、様々な形で実施することができる。
【符号の説明】
【００９５】
９０１  排他的論理和回路
９０２，９０９  加算回路
９０３  被乗数リーディングゼロカウント回路
９０４  乗数リーディングゼロカウント回路
９０５  左シフト回路
９０６，９０８  減算回路
９０７，９１０，９１２，９２５  セレクタ
９１１，９１３  インクリメント回路
９１４  デクリメント回路
９１５  乗算ループ回路
９１６  論理和回路
９１７  丸め処理回路
９１８  制御回路
９１９〜９２４  レジスタ
【図１】
2014041474.tif 000003
【図２】
2014041474.tif 000004
【図３】
2014041474.tif 000005
【図４】
2014041474.tif 000006
【図５】
2014041474.tif 000007
【図６】
2014041474.tif 000008
【図７】
2014041474.tif 000009
【図８】
2014041474.tif 000010
【図９】
2014041474.tif 000011
【図１０】
2014041474.tif 000012
【図１１】
2014041474.tif 000013
【図１２】
2014041474.tif 000014
【図１３】
2014041474.tif 000015
【図１４】
2014041474.tif 000016