5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

プログラミングの為の数学と算数

1 :デフォルトの名無しさん:2001/08/07(火) 11:19
数学(まあ算数の範囲も含めよう)的な問題のTIPS/Q&Aスレです

個別にあるとすぐに下がってしまうのでこの領域の話題をまとめましょう

関連スレ>>2

64 :デフォルトの名無しさん:2001/08/13(月) 06:36
http://www.vector.co.jp/soft/win95/game/se081546.html
貼り忘れた、逝ってくる

65 :デフォルトの名無しさん:2001/08/13(月) 06:59
もうひとつ。
vectorには>>63とこれの2つしかないな。
http://www.vector.co.jp/soft/win95/game/se202098.html

66 :デフォルトの名無しさん:2001/08/13(月) 07:46
前回との差だけ前後させる方法でやったらどうだと思ったが
 doubleだと計算誤差で元に戻れない
  long doubleでも誤差1%チョット出るな

long double a[7];
int pg;
int n;
init() { pg=0;for(int i=0;i<7;i++)a[i]=0;a[0]=1;n=1;};
double inc(){
long double r=a[pg];
 pg=(pg+1) % 7;
 r+=(r-a[pg])/6.0; //E(n ) =E(n-1) + (E(n-1)-E(n-7))/6
 a[pg]=r;
 n++;
return r;
};
double dec(){
int pg0=pg;
long double r,r0=a[pg];
 pg=(pg+7-1) % 7;
 r=a[pg];
 a[pg0] = r*7-r0*6;
  n--;
  return r;
};

double goal(int m)
{ while(n>m)dec();
 while(n<m)inc();
 return a[pg];
}

67 :デフォルトの名無しさん:2001/08/13(月) 07:51
× a[pg0] = r*7-r0*6 ;   これを
○ a[pg0] = r+(r-r0)*6.0;  こう修正すると1桁精度が上がった

68 :デフォルトの名無しさん:2001/08/13(月) 09:20
>>66
n<50 なら10万回繰り返しても精度落ちなかったから何の事かと思ったけど
n=100付近から戻れなくなるんだね

69 :デフォルトの名無しさん:2001/08/13(月) 10:06
>>66 ひとつの関数にまとめとこう

double goal(int m)
{
static long double a[7]={ 1 , 0 , };
static int pg=0;
static int n=1;
 while(n<m) {
 long double r=a[pg];
  pg=(pg+1) % 7;
  r= r+ (r-a[pg])/6.0;
  a[pg]=r;
  n++;
 }
 while(n>m){
 int pg0=pg;
 long double r;
  pg=(pg+7-1) % 7;
  r=a[pg];
  a[pg0] = r+(r-a[pg0])*6.0;
  n--;
 }
 return a[pg];
}

70 ::2001/08/13(月) 11:28
精度の問題を解決するには、 E(n)の代わりに R(n)=E(n)-n/3.5-10/21 とすれ
ばいい。 こうすればR(n)はnに応じて値が小さくなり、浮動小数点なら情報落ち
が少ない。

すぐに判るように R(n)はE(n)と同じ式になる。
初期値だけを変更すればいい。


double goal(int m)
{
#define c0 (10.0/21.0)
static double a[7]={1.0-1.0/3.5-c0,0-c0,1.0/3.5-c0
,2.0/3.5-c0 ,3.0/3.5-c0 , 4.0/3.5-c0 , 5.0/3.5-c0};
static int pg=0;
static int n=1;
 while(n<m) {
 double r=a[pg];
  pg=(pg+7-1) % 7;
  r= r+ (r-a[pg])/6.0;
  n++;
  a[pg]=r ;
 }
 while(n>m){
 int pg0=pg;
  double r;
  pg=(pg+1) % 7;
  r=a[pg];
  a[pg0] = r+(r-a[pg0])*6.0;
  n--;
 }
 return a[pg]+(double)m/3.5+c0;
}

71 ::2001/08/16(木) 11:46
何かネタない? age

72 :デフォルトの名無しさん:2001/08/19(日) 12:57
age

73 :デフォルトの名無しさん:2001/08/20(月) 10:41
メタボールと視線ベクトルとの交差判定の方法を知りたいんです。
たぶん3D系よりもこっちの方が向いてそうだと思うんですが。

74 :デフォルトの名無しさん:2001/08/20(月) 10:47
>>73 専門スレ以外で聞く時は専門用語の解説をしておくのがエチケットだよ

75 :デフォルトの名無しさん:2001/08/20(月) 10:49
>>73
そこまで行ったら数学板逝って訊いた方がいい。

76 :デフォルトの名無しさん:2001/08/20(月) 11:09
>>74 ごめんなさい。
http://www.kaigisho.ne.jp/literacy/midic/data/k34/k3434.htm
こういうヤツです。あのターミネーターでも使われてたヤツ。

>>75

できるだけ高速に、無駄なく、精度良く調べたいんです。
http://www.eml.hiroshima-u.ac.jp/member/jrs/nis/javaexampl/metaj/metajav.html

ニュートン法じゃダメですよね・・・

77 :デフォルトの名無しさん:2001/08/20(月) 11:16
>>76 それじゃまだ判らないよ

3次元上の点 Pn と その距離 Rn に応じた濃度 f(Rn)
Σ f(Rn) = C になる点の集合で表現するようだという事は判るけど

fはどんな関数? (1/Rn)^2 みたいな感じ?

78 :デフォルトの名無しさん:2001/08/20(月) 16:34
>>77 アウアウア- 説明下手でごめんなさい。


基本的には、f(Rn)=^{def}(1/Rn)^2で結構です。
それ以外にもいろいろ種類はあります(直方体とか)が、
まずはメタボール球を表示したいと思いまして。

アルゴリズムにはレイトレーシングを使ってます。

79 :デフォルトの名無しさん:2001/08/20(月) 16:51
各点ごとに 重みみたいなのが違うんですね?

Pn迄の距離 Rn から Σ (Wn/Rn^2) =1 になる点の集合って事ですね

ニュートン法でいいんじゃないでしょうか?

80 :◆3DelPhIM:2001/08/20(月) 20:15
結局、精度のよい初期値をどう求めるかという問題じゃないかな
先に荒く多面体近似してそれとの交点を求めてからニュートン法かな

81 :78:2001/08/20(月) 21:44
あと、問題としては法線ベクトルがあるんです。
法線をどうにか取得しなきゃいけないのです。


やっぱりニュートン法ですかね・・・

82 :78:2001/08/20(月) 22:16
http://www.ceres.dti.ne.jp/~dycoon/program/meta/emeta.html

自己レス。求めてた物は見つかりました。
でも法線がわっかんないんだよなぁ。

83 :デフォルトの名無しさん:2001/08/20(月) 22:42
78って・・・もしかして

84 :デフォルトの名無しさん:2001/08/20(月) 22:51
>>83
はっきり言え

85 :78:2001/08/21(火) 00:10
>>83
何ですか?

86 :78:2001/08/22(水) 00:02
>>83

なぁ。なんなんだよ。

87 :デフォルトの名無しさん:2001/08/22(水) 00:10
>>85-86
8分戻ってる!
とか一瞬思ってしまった。

88 :デフォルトの名無しさん:2001/08/22(水) 00:25
>>87 ありがとう(笑

89 :デフォルトの名無しさん:2001/08/22(水) 01:26
http://cheese.2ch.net/test/read.cgi?bbs=math&key=998375037&ls=50
見て

90 :デフォルトの名無しさん:2001/08/24(金) 23:25
Physics for Game Developers
http://www.oreilly.com/catalog/physicsgame/
10月に出版予定。

91 :デフォルトの名無しさん:2001/08/25(土) 05:42
#include<stdio.h>
int main(void)
{
char *s = "age";
printf("sage");

return 0;
}

92 :デフォルトの名無しさん:2001/08/25(土) 09:59
四則演算で7行かあ・・・
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=994908590&st=551&to=551
これでも頑張ってる方だと思うからなあ

93 :デフォルトの名無しさん:01/09/25 22:01
お室こもひねの瑠璃の暦鼓膜誌筆祖トンはさきくかんまならむ゜まなゆやかおんえかうおやんゆなのよにわほにりのまくきはしちそしすかひきんくみなにのりらせれめろ゛瑠璃にね幕費は差費そしすかんまののれけりのまみきひしはしいすかになせるめむ゜理の門子祖は

94 :デフォルトの名無しさん:01/09/26 07:22
ここのスレッドに該当するかどうかは分かりませんが、質問します。
24時間制の"時刻"は、"秒"と"分"が60進数、"時"が24進数と分かっていて
「0時丁度から12345秒経過した時点での時・分・秒の値を求めよ」という問題も
簡単に解くことができます。求めるべき値が3個、○進数の要素が2つしかないからです。

これを一般化して"N個の数"があり、それぞれが独立して"○進数である"という
属性を持っているとき、前述の"12345"のように「ある値」を指示されたとき
N個の数におけるそれぞれの値を効率良く求める算法・アルゴリズムのようなものは
存在するのでしょうか? 勿論「ある値」は"N個の数"で表せる数値
(冒頭の時刻の例なら 24*60*60-1=86399)を超える値ではないものとします。

95 :デフォルトの名無しさん:01/09/26 07:49
>>94 n進数であるという事はあまり関係なく

x = Σ an*ΠAj ただしan<ΠAj に必ず解があるかという問題のような気がしますが?

96 :デフォルトの名無しさん:01/09/26 07:56
>>94
n桁目の値 = (ある値 / (nより小さい桁の進数の積)) % nの進数
// 桁ってのは24時間制なら 時=3桁目 分=2桁目 秒=1桁目 ってな感じね。

これじゃダメ?
効率が悪くてダメ?

>>95
意味わかんねえ…鬱。

97 :95:01/09/26 07:59
ごめん
ΠAj = A0*A1*A2・・・An という掛算のつもりです

98 :デフォルトの名無しさん:01/10/09 10:17
age

99 :デフォルトの名無しさん:01/10/21 20:35
AGE

100 :頭文字?:01/10/21 22:57
ところでこれって>>95 >>97
Σummation = 加算
Πroduct = 積
とかなの?
とかここで訊いちゃダメ?

101 :ヤパーリ:01/10/21 22:59
age

102 :1:01/10/24 08:05
N進数M桁の多倍長の計算方法

 負数 各桁毎に(N-1)の補数を取り、 キャリーcyを1にする
cy=1;
for(i=0;i<M;i++){
 cy = a[i]+(N-1-b[i])+cy;
  c[i]=cy % N;
  cy =cy / N;
}

103 :1:01/10/24 08:18
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=1001998049&st=863&to=863&nofirst=true
あめ猫さんはちょっと間違ったみたい
0x10000 じゃなくて 0x10000-1 です

で補数を取った時の掛算のやり方
 1、 絶対値を求めてから掛算して 結果の符号によって再度負数にする方法
    桁数を可変にする多倍長の場合はこっちでやった方がいいかも

 2、そのまま掛算する場合は
    Bが負数の場合 Bを単純整数とみなすと B-N^Mになりますから
    A*(B-N^M)=A*B-A*N^M
   A,Bがともに負数の場合は
    (A-N^M)*(B-N^M)=A*B-(A+B)*N^M+N^M^2 ・・・・N^M^2 は桁外になるので

   結局 A,Bを符号無整数とみなして掛算して 負数なら M桁目から引けばよいという事になります

104 :1:01/10/24 08:52
10進数でやってみます。2桁としますが符号の為に3桁目を用意します

 23−49 の計算
最下位桁:CY=1; 3−9+CY = 3+10−1−9+CY=4
次の桁 :CY=0; 2−4+CY = 2+10−1−4+CY=7
最上位桁:CY=0: 0−0+CY = 0+10−1−0+CY=9

結果974となります。最上位の9は負数を示します
これをさらに符号を反転するには0から引算します。
最下位桁:CY=1; 0−4+CY = 0+10−1−4+CY=6
次の桁 :CY=0; 0−7+CY = 0+10−1−7+CY=2
最上位桁:CY=0: 0−9+CY = 0+10−1−9+CY=0

掛算のやりかた
掛算2桁X2桁で4桁になり、符号の為に5桁目を用意します
 −26*12=-312 の計算
まず負数を補数表現にして
 974*12=>74*12−7400=888-1200=−312

105 :デフォルトの名無しさん:01/10/25 01:04
アッカーマン関数っておもしろいですね。
普通は大学で習うのですか?

106 :デフォルトの名無しさん:01/10/25 01:13
>>102-104
解説ありがとうございます。
これをもとに実装できそうです。

もしよければ、除算の手がかりなんかも
アドバイスしてもらえないでしょか。

107 :1:01/10/25 08:42
多桁除算の方法は、
1)シフトしながら減算出来れば減算するという方法

2)ニュートン法>>9

があります。
 桁数が多く、掛算が高速に実装出来ているならニュートン法が良好です
 ニュートン法は初期値が悪いと収束迄時間がかかりますから、
 初期値は多桁の2数を浮動小数点化するか対数化して精度良く求めるのが
 後の計算回数を劇的に改善する事になります。

108 :デフォルトの名無しさん:01/10/25 09:45
FFTを使った高速な掛算はここでみかけたよ

   最速の素数判定アルゴリズム 
http://piza2.2ch.net/test/read.cgi/tech/993457354/

109 :Delあめ猫にゃ:01/10/25 10:01
>>103 フォローありがと

110 :106:01/10/25 17:42
>>107
ニュートン法は色々サンプルがあるようなので、2の方法で実装できそうです。

>>108
私もそこは読んでました。最終目標はそれなんですけど、
まずは動くものから作り上げないとしょうがないので、今は手を出せません。

111 :デフォルトの名無しさん:01/10/26 01:10
http://piza2.2ch.net/test/read.cgi/tech/1003559977/
x>yとして、荒い √(x*x+y*y) の計算でx+ (y*y/x)* 0.429で近似できるってのの
導出過程がちゃんと分かる方います?

(y/x)^2でテイラー展開すればそれっぽい形になるような気もするけど、
0.429がちょうどいいって所まではちょっと分からないです。

112 :1:01/10/26 07:47
>>111

√(x^2+y^2)=x*√{1+(y/x)^2}
√(1+a^2)を級数展開すると 1+a^2/4-a^4/8 + ・・・

だから 2項で止めると x+(y*y/x)*0.5

そこで、a0*x+a1*(y*y/x) として a0,a1が最適近似になるように調整したのでは


荒いhypotの計算方法はここに色々あるようです
ttp://www.infoeddy.ne.jp/~tensyo/prog/linealgo.htm#hypotenuse

精度の良い高速な計算方法はここ
http://www.sra.co.jp/people/miyata/algorithm/hypot.txt

113 :ななしヘタぐらま:01/10/26 14:06
>>61, >>63
化石レスですが
本双六=バックギャモンです.
確か奈良時か平安時代に日本に入ってきて,
江戸時代に現代の双六になった…んじゃなかったかな.

32 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)