• 締切済み

絶対値の取り方

2つ数値の差を絶対値で求める適切な計算法を探しています. 2つの候補の内,回路の大きさが小さくなりそうな方はどちらですか? また,絶対値を求める他の方法があったら教えてください。 <候補1> X(絶対値)a1,a2(データ) if(a1 < a2) X <= a2 - a1; elsif (a2 > a1 ) X <= a1 -a2; else X <= 0 <候補2> df(N+1) 絶対値 X をビットで表現したときの最上位ビット X <= a1-a2 X   <= ( df(N+1) xor df(N) ) & ( df(N+1) xor df(N-1) ) & ( df(N+1) xor df(N-2) ) & ・・・・・・・ ( df(N+1) xor df(2) ) & ( df(N+1) xor df(1) ) & ( df(N+1) xor df(0) ) + ("000000000" & df(N+1));

みんなの回答

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

考え方は<候補1>、回答のような1ビット演算回路をならべると、回路図が見やすそうで、規模も小さくなりそうだな、と思ったので。 <候補1>だと Nビット比較器とNビットセレクタとNビット減算器が必要な感じに見えたので、それだと無駄な配線が多くなりそうな感じがしたもので。 最近の論理合成プログラムはよくできてるそうで、プログラムのような感覚で設計できるとか。そんな環境なら、私の書いた方法はあまりやくにたたないかもしれません。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

ハードはそんなに詳しくはないのですが 絶対値の演算を論理回路を組み合わせてやりたい、ということでよろしいですか? &,(N)は a1: a1(N) & a1(N-1) & ...& a1(1) & a1(0) a2: a2(N) & a2(N-1) & ...& a2(1) & a2(0) のような構成の意味でしょうか。 入力a1(i),a2(i),cmp(i+1),sel(i+1),Carry(i-1) 出力cmp(i),sel(i),df(i),Carry(i) cmp(i+1) =False なら cmp(i)<= (a1(i) ≠ a2(i)) sel(i)<= (a1(i) > a2(i)) cmp(i+1) =Trueなら cmp(i)<=cmp(i+1) sel(i)<=sel(i+1) 出力は sel(i) =True なら df(i),Carry(i)<=a1(i) - a2(i) -Carry(i-1) sel(i) =False なら df(i),Carry(i)<=a2(i) - a1(i) -Carry(i-1) のような回路をビット数並べるといい気がします。

tyamoroneu
質問者

お礼

お答えありがとうございます この部分で if文を論理演算を表し,{ if(a1 < a2), else } cmp(i+1) =False なら cmp(i)<= (a1(i) ≠ a2(i)) sel(i)<= (a1(i) > a2(i)) cmp(i+1) =Trueなら cmp(i)<=cmp(i+1) sel(i)<=sel(i+1) この部分で,if文の中身の計算ですね。 sel(i) =True なら df(i),Carry(i)<=a1(i) - a2(i) -Carry(i-1) sel(i) =False なら df(i),Carry(i)<=a2(i) - a1(i) -Carry(i-1) この方法は<候補1>と同じような気がします、、

tyamoroneu
質問者

補足

<絶対値の演算を論理回路を組み合わせてやりたい、ということでよろしいですか? 絶対値演算を論理式で記述するか,セレクタ(if文)を用いた記述するか どちらがシステム的に優れているかということです。 ↓2の補数を求めています。 最上位ビットが1なら符号を反転,最後に1を足す. X   <= ( df(N+1) xor df(N) ) &      ( df(N+1) xor df(N-1) ) & ( df(N+1) xor df(N-2) ) & ・・・・・・・ ( df(N+1) xor df(2) ) & ( df(N+1) xor df(1) ) & ( df(N+1) xor df(0) ) + ("000000000" & df(N+1));

  • edomin7777
  • ベストアンサー率40% (711/1750)
回答No.1

「回路の大きさが小さくなりそうな方」 回路が何を指しているのか判りませんが、1点だけ。 候補1の最後のelseは要りますか? if(a1 < a2) X <= a2 - a1; elsif (a1 > a2) X <= a1 -a2; ←ここの間違いは修正。 else X <= 0  ←ここ a1 < a2 じゃ無かったら、 a1 > a2 又は a1 = a2 だけど、0を代入するなら、 a1 - a2 も、0になるんじゃないの?

tyamoroneu
質問者

お礼

回答ありがとうございます ご指摘のとおり0の代入も必要なさそうですね if(a1 < a2) X <= a2 - a1; else X <= a1 -a2

関連するQ&A

  • perl

    授業でperlをやっていて課題がでてるのですが、 よく分かりません。 200以上300未満の数字か否かを判断する物を作りたいです。 が、300以上だと反応はないのですが200未満でも反応があります。 どこが違うのか教えてください 2つあります。 (1) my $a= 118; if($a < 200 ){ print "" } elsif($a => 300 ){ print "" } else { print "OK.\n"; } (2) my $x =111; if ($x ge 200 && $x lt 300){ print "OK.\n"; }

  • 乗算器とカウンタ

    乗算器とカウンタのどちらの方が回路規模が小さくなるのでしょうか? Nビット乗算器の,Nはシステムにより異なるため,10ビット以上をとることもあれば,(A*1)のようなものもあります。 現状のシステムで乗算器は (A-B) * X という形で使用しています. (AとBは定数のため,論理合成時に Y*Xとなっていると推測しています。Yが0になることもあります) カウンタ回路は,まだ実装していませんが, if( ck ) if( リセット条件 )     syuturyoku <= 0; else if ( 更新条件 ) syuturyoku <= syuturyoku + 1; end if; のような(一般的な)記述をしようとしています

  • 関数呼び出しを使った、絶対値出力プログラムについて質問です。

    すみませんが、このプログラムを見てもらえませんか? 絶対値が上手く表示できません。よろしくお願いします。 #include <stdio.h> double myabs(double); main() { double x,a; printf("Input number = "); scanf("%lf", &x); if(x < 0) { a = myabs(x); printf("Zetaitti = %f\n", a); } else { printf("Zetaitti = %f\n", x); } } double myabs(double x) { double a; x = -x; return(a); }

  • 絶対値に関して

    a=∫{0→1}1/(1+x)dx a(n)=∫{0→1}1-(-x)^n/(1+x)dx において|a(n)-a|を絶対値記号をはずしたとき ∫{0→1}x^n/(1+x)になると書いてあるのですが理解できません。 どなたかご教示いただければありがたいです お願いします

  • Rubyプログラミングの課題について☆

    大学のレポートで下のような課題が出て、実際プログラムを自分で作って実行してみたのですが、全く無反応でいくら考えても原因がわかりません(T_T)批判されそうな質問かもしれないですが、留年かかっているので親切な方、助言お願いします。。 ●下の動作をするプログラム(a.rb)を作れ  %a.rb "+[1,20] =>21 %a.rb "*[-1,25,4] =>-100 ●作ってみたプログラム↓ class Array def list_ope d=0 #最終的に返す値 s=0 #状態番号 x="" #一時的に数値を入れる op="" #[+,-,*,/] sgn=1 #マイナスの符号のあるなし err=999999 self.each{|i| case s #とりあえず、[+,-,*,/]をopに代入 when 0 op=i s=1 when 1 if /\[/ =~ i  s=2 else s=err; bleak end when 2 sgn=1; x=0; if /[1-9]/ =~ i #1~9の時 x+=i; s=3 elsif /-/ =~ i #マイナスの時 sgn=-1; s=3 else s=err; bleak end when 3 if /[0-9]/ =~ i #0~9の時 x+=i; elsif /,/ =~ i #コンマの時 x=sgn*x.to_i; s=4 elsif /\]/ =~ i #]の時 x=sgn*x.to_i; s=5 else s=err; bleak end when 4 #コンマの時の処理 if /\+/ =~op d=d+x elsif /-/ =~ op d=d-x elsif /\*/ =~ op d=d*x elsif / =~ op d=d/x end s=2 when 5 #]のときの処理 if /\+/ =~op d=d+x elsif /-/ =~ op d=d-x elsif /\*/ =~ op d=d*x elsif / =~ op d=d/x end s=6 #終了状態 end } if s==6 return d #dを返す else print "error!" end end end

  • 排他的論理和xorを用いた代数方程式

    以下の代数方程式を解く一般的な手法があれば教えてください。 解析的でも計算機を用いても構いません。 x^n XOR a_(n-1) x^(n-1) XOR・・・XOR a_0 = 0 ここで、xは0以上の整数 a_iは0または1です。

  • おかしなif文だと思うのですが、どう思われますか?

    $a=10; $b=20; if($a>=$b){ print "\$aは\$bと等しいかおおきいですよ。\n"; } elsif($a>$b){ print "\$aは\$bより大きいです。\n"; } elsif($a<$b){ print "\$aは\$bより小さいです。\n"; } ある例題のif文なんですが、 $a>=$bで$a>$bは内包されているはずなので elsifの例として不適切ですよね。 どう思われますか?

    • ベストアンサー
    • CGI
  • if プログラムソース

    このプログラムソースでやりたいことは、 東海と入力すると 地方だと 東海は900円になります。 と表示させたいのですが、 うまく表示されません。 分かる方いましたら、教えてください。 教えて頂けると、助かります。 よろしくお願いします。 以下、プログラムソースです。 print"愛知県から小包の地方を入力してください。\n"; chomp($t=<>); if ( $1=="関東,信越,近畿,東海,北陸") { print"$t地方だと \n"; } elsif ( $1=="東北,中国,四国" ) { print"$t地方だと \n"; } elsif ( $1=="九州") { print"$t地方だと \n"; } elsif ( $1=="北海道") { print"$t地方だと \n"; } elsif ( $1=="沖縄" ) { print"$t地方だと \n"; } if ( $1 == 60 ){ print"$1は700円になります。\n"; } elsif ( $1==80) { print"$1は900円になります。\n"; } elsif ( $1==100 ) { print"$1は1,100円になります。\n"; } elsif ( $1==120 ) { print"$1は1,300円になります。\n"; } elsif ( $1== 140 ) { print"$1は1,500円になります。\n"; } elsif ( $1== 160 ) { print"$1は1,700円になります。\n"; }else { print"$1は1,900円になります。\n"; }

    • ベストアンサー
    • Perl
  • C言語で入力した実数の絶対値を求める

    現在C言語を勉強し始めたばかりなので 協力お願いします。 今回書きたいのは題名にある通り 実数の絶対値を求めるプログラミングです。 ソースは以下の通りです。 #include <stdio.h> main(){ float x,z; printf("Input Nonber\n"); scanf("%f",&x);      if( A >= B ) z=C else z=D; printf("Answer=\n",z); } この中で条件付するときの A,B,C,Dをどうすればいいか分からないので 教えてください。 また書いているもので間違えなどがあれば ご指摘していただけたら嬉しいです。

  • 入力された2つの整数の差を絶対値を出力するプログラム

    2整数の差を絶対値を出力するプログラムをつくりました. 入力される数値は、正数の場合は最大8桁まで有効とし、9桁目以降を無視、負数の場合は '-'を含め、最大9桁まで有効とし,10桁目以降を無視するようにしたい。 2番目の数値入力で9桁以降に数字以外の文字を入力すると,うまく動きません.なぜ動かないかとどのように直したらよいか教えてください. お願いします. #include <stdio.h> #include <stdlib.h> #define BUFFERSIZE 10 #define PLUS_MAX 8 #define MINUS_MAX 9 #define C_NULL ('\0') #define RC_OK 0 #define RC_ND -1 #define RC_ID -2 #define RC_MD -3 int absolute( int n1, int n2 ) ; main() { char n[ 2 ][ BUFFERSIZE ]; int i ; int a[ 2 ] ; int ab ; int count ; int n_pos ; char c ; for( i = 0 ; i < 2 ; i ++ ){ printf( "%d番目の数値 :", i + 1 ) ; for( count = 0 ; count <= BUFFERSIZE ; count ++ ){ c = getchar() ; if( c >= '0' && c <= '9' || count == 0 && c == '-' ){ n[i][ count ] = c ; continue ; } if( c == '\n' ) break ; printf( "Error!\n" ) ; return( RC_ID ) ; } if( count == 0 ){ printf("Error!\n"); return( RC_ND ); } else if( n[ i ][ 0 ] == '-' && count < 2 ){ printf("Error!\n"); return( RC_ID ) ; } if( n[ i ][ 0 ] == '-' && count > MINUS_MAX ){ n_pos = MINUS_MAX ; }else{ if( count > PLUS_MAX ){ n_pos = PLUS_MAX ; }else{ n_pos = count ; } } n[ i ][ n_pos ] = '\0' ; a[ i ] = atoi( n[ i ] ) ; } ab = absolute( a[ 0 ], a[ 1 ] ) ; printf( "絶対値は %d \n", ab ) ; return( RC_OK ); } int absolute(int n1, int n2) { int i ; i = n1 - n2 ; return i >= 0 ? i : -i ; }