やじゅ@アプリケーション・ラボ わんくま支局

目次

Blog 利用状況

ニュース

プロフィール

MSMVP

[Javascript] SinとCosの誤差発生について

Javascriptに限らないのですが、コンピュータでは数学と違って誤差が発生するケースがあります。
これは、コンピュータが取り扱うデータは、ビット数の限られた有限のものだからです。
例えば、1÷3の結果である0.3333…という循環小数をコンピュータが正確に表すことはできません。

MathクラスのSinメソッドとCosメソッドについて
http://social.msdn.microsoft.com/Forums/ja/vsgeneralja/thread/fc03347d-c9a3-4e6f-b378-f781dd1d9ff4

下記の表は、各角度に対して左側SIN,COSが数学上での値、右側SIN,COSがコンピュータ(Javascript)での値となります。

角度

SIN

COS

SIN(角度*Math.PI/180)

COS(角度*Math.PI/180)

90

1

0

1

6.1232339957366e-17

180

0

-1

1.2246063538223773e-16

-1

270

-1

0

-1

-1.836909530733566e-16

360

0

1

-2.4492127076447545e-16

1


これに気が付いたのが、Javascriptでキャラクターを角度指定でとりあえず上下に動かすように作成していた時に、下方向から反転して上方向に移動したとたんに、キャラクターが横方向に動いてしまったからです。
Chromeでデバッグしてみると、COSが270度の時に本来0を想定していたのに、-1.836909530733566e-16という値が返ってきたために、x<0の条件で、角度が-90度されて180度の動きになってしまったのです。

function moveFish(no){
    // 移動量を求める
    var rot = fish[no].ang;
    var sp = fish[no].speed;
    dx = Math.cos(rot * Math.PI / 180) * sp;
    dy = Math.sin(rot * Math.PI / 180) * sp;

    fish[no].x += dx;
    fish[no].y += dy;

    var x = fish[no].x;
    var y = fish[no].y;

    if(x > (canvas.width-fish[no].image.width)){
        fish[no].ang += 90;
    }
    if(x < 0){
        fish[no].ang -= 90;
    }

    if(y > (canvas.height-fish[no].image.height)){
        fish[no].ang += 180;
    }
    if(y < 0){
        fish[no].ang -= 180;
    }
}

では、どうやって対処するのか?
今回の場合はキャラクターを画面に表示するのが目的なので、小数ではなく整数に変換します。
日経ソフトウェア5月号のHTML5ゲームプログラミング入門の記事によると「drawImage関数は小数を含む座標を渡してしまうと、処理が一気に数倍重くなります。これは小数を含む場合はアンチエイリシングをしてキレイに見せようとするためだと思われます。」と書いてあります。
このように処理速度も考慮しても整数化した方がいいわけです。

小数を整数化するメソッドとして代表的なものに、Math.floor、Math.ceil、parseIntですが、
これ以外にテクニックとして、論理演算(例 x | 0)を使って整数化する方法があります。
例では、ゼロで論理和を取ることで整数に変換します(Math.floor(x)とはマイナス時に違いがある)。
http://d.hatena.ne.jp/amachang/20070813/1186980089
また、Math.floor(x)を使うよりはブラウザによってはかなり高速になります。
http://d.hatena.ne.jp/htsign/20120211/1328970561
JavaScriptのビット演算の仕組みを理解する
http://d.hatena.ne.jp/mindcat/20091119/1258651717

■COS
rot = 90; //数学上では、1となる
alert(Math.cos(rot * Math.PI / 180))                  //6.1232339957366e-17
alert(Math.floor(Math.cos(rot * Math.PI / 180)))  //0
alert(Math.ceil(Math.cos(rot * Math.PI / 180)))    //1
alert(parseInt(Math.cos(rot * Math.PI / 180)))     //6
alert(Math.cos(rot * Math.PI / 180) | 0)             //1   

var rot = 270; //数学上では、0となる
alert(Math.cos(rot * Math.PI / 180))                  //-1.836909530733566e-16
alert(Math.floor(Math.cos(rot * Math.PI / 180)))  //-1
alert(Math.ceil(Math.cos(rot * Math.PI / 180)))   //0
alert(parseInt(Math.cos(rot * Math.PI / 180)))    //-1
alert(Math.cos(rot * Math.PI / 180) | 0)            //0

■SIN
var rot = 180; //数学上では、0となる
alert(Math.sin(rot * Math.PI / 180))           //1.2246063538223773e-16
alert(Math.floor(Math.sin(rot * Math.PI / 180)))  //0
alert(Math.ceil(Math.sin(rot * Math.PI / 180)))    //1
alert(parseInt(Math.sin(rot * Math.PI / 180)))     //1
alert(Math.sin(rot * Math.PI / 180) | 0)             //0

var rot = 360; //数学上では、0となる
alert(Math.sin(rot * Math.PI / 180))                  //-2.4492127076447545e-16
alert(Math.floor(Math.sin(rot * Math.PI / 180)))  //-1
alert(Math.ceil(Math.sin(rot * Math.PI / 180)))   //0
alert(parseInt(Math.sin(rot * Math.PI / 180)))    //-2
alert(Math.sin(rot * Math.PI / 180) | 0)            //0

   

結果からすると、正しい答えを出すのは、論理演算だけなんですね。
parseIntは、文字列を数値にする目的なだけあって、小数点以降を切るだけなので指数表示になると駄目ですね。

東大生が教えるビジュアル数学 三角関数
http://www24.atpages.jp/venvenkazuya/math1/trigonometric_ratio4.php

投稿日時 : 2012年4月7日 23:37

コメントを追加

# ivermectin gel http://stromectolabc.com/
ivermectin ebay 2022/02/08 9:39 Busjdhj

ivermectin gel http://stromectolabc.com/
ivermectin ebay

# doxycycline hyclate https://doxycyline1st.com/
doxycycline tetracycline 2022/02/26 8:29 Doxycycline

doxycycline hyclate https://doxycyline1st.com/
doxycycline tetracycline

# ed medications list https://erectionpills.best/
cheapest ed pills online 2022/06/28 19:57 ErectionPills

ed medications list https://erectionpills.best/
cheapest ed pills online

# ema paxlovid https://paxlovid.best/
medicaments covid 2022/09/08 7:43 Paxlovid

ema paxlovid https://paxlovid.best/
medicaments covid

# free date site https://datingtopreview.com/
asians dating site 2022/10/17 20:40 Dating

free date site https://datingtopreview.com/
asians dating site

# meet singles free https://topdatingsites.fun/
pof dating app 2022/11/15 0:30 DatingTop

meet singles free https://topdatingsites.fun/
pof dating app

# drug prices prednisone https://prednisonepills.site/
prednisone over the counter australia 2022/11/28 23:55 Prednisone

drug prices prednisone https://prednisonepills.site/
prednisone over the counter australia

# ed medications online https://edpills.science/
pills for ed 2023/01/07 13:52 EdPills

ed medications online https://edpills.science/
pills for ed

# top 10 mail order pharmacies https://pillswithoutprescription.pro/# 2023/05/14 22:15 PillsPresc

top 10 mail order pharmacies https://pillswithoutprescription.pro/#

# reputable indian pharmacies 2023/08/22 12:13 Jeffreybloft

http://gabapentin.pro/# gabapentin online

# buy cytotec online 2023/08/25 3:17 Georgejep

http://avodart.pro/# where to buy cheap avodart online

# farmacie on line spedizione gratuita 2023/09/25 7:47 Archieonelf

http://farmaciaonline.men/# acquistare farmaci senza ricetta

# acquisto farmaci con ricetta 2023/09/26 9:05 Archieonelf

https://onlineapotheke.tech/# online apotheke deutschland

# versandapotheke 2023/09/27 1:57 Williamreomo

http://onlineapotheke.tech/# online apotheke gГ?nstig
online apotheke preisvergleich

# gГјnstige online apotheke 2023/09/27 5:32 Williamreomo

https://onlineapotheke.tech/# п»?online apotheke
online apotheke gГ?nstig

# versandapotheke deutschland 2023/09/27 6:21 Williamreomo

https://onlineapotheke.tech/# gГ?nstige online apotheke
п»?online apotheke

# п»їonline apotheke 2023/09/27 6:45 Williamreomo

https://onlineapotheke.tech/# online apotheke deutschland
internet apotheke

# farmaci senza ricetta elenco 2023/09/27 9:01 Archieonelf

http://onlineapotheke.tech/# versandapotheke

# farmacia online piГ№ conveniente 2023/09/27 21:09 Rickeyrof

acheter sildenafil 100mg sans ordonnance

# farmacia online miglior prezzo 2023/09/27 22:31 Rickeyrof

acheter sildenafil 100mg sans ordonnance

# farmacia online senza ricetta 2023/09/28 15:34 Rickeyrof

acheter sildenafil 100mg sans ordonnance

# erectile dysfunction drug 2023/10/08 23:44 BobbyAtobe

Love the seasonal health tips they offer. http://doxycyclineotc.store/# cheap doxycycline tablets

# doxycycline otc 2023/10/09 4:16 GaylordPah

Efficient, effective, and always eager to assist. http://edpillsotc.store/# medication for ed

# mexican mail order pharmacies 2023/10/16 15:59 Dannyhealm

They offer unparalleled advice on international healthcare. http://mexicanpharmonline.shop/# mexico drug stores pharmacies

# canadian certified pharmacies 2023/10/16 18:30 Dannyhealm

Their compounding services are impeccable. https://mexicanpharmonline.shop/# mexican mail order pharmacies

# canadian pharmecy 2023/10/16 23:57 Dannyhealm

Setting the benchmark for global pharmaceutical services. https://mexicanpharmonline.shop/# mexican border pharmacies shipping to usa

# canada rx prices 2023/10/17 1:21 Dannyhealm

Their global pharmacists' network is commendable. http://mexicanpharmonline.shop/# mexican mail order pharmacies

# canadian cheap rx 2023/10/17 20:52 Dannyhealm

Love their range of over-the-counter products. http://mexicanpharmonline.com/# pharmacies in mexico that ship to usa

# canada meds online 2023/10/18 0:17 Dannyhealm

The go-to place for all my healthcare needs. https://mexicanpharmonline.shop/# pharmacies in mexico that ship to usa

# canadian pharmacies that deliver to the us 2023/10/18 8:54 Dannyhealm

A beacon of reliability and trust. http://mexicanpharmonline.shop/# mexican rx online

# buy valtrex online no prescription https://valtrex.auction/ buy valtrex cheap online 2023/10/24 17:47 Valtrex

buy valtrex online no prescription https://valtrex.auction/ buy valtrex cheap online

# paxlovid generic 2023/10/27 2:08 LarryNef

http://paxlovid.bid/# paxlovid buy

# doxycycline 500mg https://doxycycline.forum/ doxycycline 100mg 2023/11/25 9:10 Doxycycline

doxycycline 500mg https://doxycycline.forum/ doxycycline 100mg

# paxlovid india 2023/12/01 4:10 Mathewhip

paxlovid buy http://paxlovid.club/# paxlovid india

# farmacia barata 2023/12/07 14:27 RonnieCag

http://vardenafilo.icu/# farmacias online seguras

# farmacias online seguras en españa 2023/12/07 23:51 RonnieCag

http://vardenafilo.icu/# farmacia online

# farmacia envíos internacionales 2023/12/08 3:02 RonnieCag

http://sildenafilo.store/# sildenafilo 50 mg comprar online

# farmacia online envío gratis 2023/12/08 11:39 RonnieCag

https://farmacia.best/# farmacia envíos internacionales

# farmacia online madrid 2023/12/08 20:37 RonnieCag

http://tadalafilo.pro/# farmacia online 24 horas

# farmacia online envío gratis 2023/12/09 12:11 RonnieCag

http://vardenafilo.icu/# farmacia envíos internacionales

# farmacias online seguras en españa 2023/12/10 4:45 RonnieCag

https://vardenafilo.icu/# farmacia envíos internacionales

# farmacias online baratas 2023/12/10 21:42 RonnieCag

http://tadalafilo.pro/# farmacias online baratas

# farmacia 24h 2023/12/11 4:44 RonnieCag

http://tadalafilo.pro/# farmacia online madrid

# farmacias online seguras en españa 2023/12/11 16:22 RonnieCag

https://vardenafilo.icu/# farmacia online 24 horas

# farmacia envíos internacionales 2023/12/11 19:52 RonnieCag

http://sildenafilo.store/# comprar sildenafilo cinfa 100 mg españa

# farmacia envíos internacionales 2023/12/12 6:35 RonnieCag

https://sildenafilo.store/# se puede comprar sildenafil sin receta

# farmacia online barata 2023/12/12 9:26 RonnieCag

http://vardenafilo.icu/# farmacia online barata

# farmacias baratas online envío gratis 2023/12/12 15:16 RonnieCag

https://sildenafilo.store/# sildenafil 100mg genérico

# farmacias baratas online envío gratis 2023/12/12 18:37 RonnieCag

http://vardenafilo.icu/# farmacia online madrid

# farmacia envíos internacionales 2023/12/13 1:36 RonnieCag

https://vardenafilo.icu/# farmacia 24h

# farmacia online envío gratis 2023/12/13 8:43 RonnieCag

https://sildenafilo.store/# sildenafilo 50 mg precio sin receta

# Acheter médicaments sans ordonnance sur internet 2023/12/15 9:38 Larryedump

https://pharmacieenligne.guru/# Pharmacie en ligne fiable

# Pharmacie en ligne France 2023/12/15 15:20 Larryedump

http://pharmacieenligne.guru/# Pharmacie en ligne sans ordonnance

# pharmacie ouverte 2023/12/16 1:40 Larryedump

https://pharmacieenligne.guru/# pharmacie en ligne

# paxlovid covid 2023/12/26 19:53 Brianmooda

https://prednisone.bid/# prednisone for dogs

# best drug for ed 2024/01/09 4:22 CharlesDioky

http://tadalafildelivery.pro/# tadalafil price

# mens erection pills 2024/01/10 5:24 CharlesDioky

http://tadalafildelivery.pro/# tadalafil 22 mg

# order clomid 2024/01/11 9:37 JeffreyRom

https://prednisone.auction/# prednisone 10 mg

# order generic clomid for sale 2024/01/12 1:55 JeffreyRom

https://prednisone.auction/# prednisone generic cost

# zestril 10 mg in india 2024/01/12 19:55 CharlieThecy

http://furosemide.pro/# lasix generic name

# comprare farmaci online con ricetta 2024/01/16 1:20 Robertopramy

http://tadalafilitalia.pro/# farmaci senza ricetta elenco

# canadian pharmaceuticals online safe 2024/01/23 5:26 Stevenhex

http://edpills.bid/# ed treatment pills

# ï»¿pharmacie en ligne 2024/01/28 11:05 JerryNef

http://pharmadoc.pro/# Pharmacies en ligne certifiées

# price of ivermectin tablets 2024/01/30 5:22 Andrewamabs

https://ivermectin.store/# ivermectin 9 mg

# drug canada 2024/02/09 0:52 Williamzelia

https://edpill.cheap/# erectile dysfunction drug

# top rated ed pills https://edpill.cheap/ ed treatments 2024/02/09 19:56 EdPills

top rated ed pills https://edpill.cheap/ ed treatments

# Abortion pills online 2024/03/02 11:33 Irvinliz

http://cytotec24.com/# cytotec pills buy online

# lana rhoades - https://lanarhoades.fun/ lana rhoades video
2024/03/02 21:09 Rhodess

lana rhoades - https://lanarhoades.fun/ lana rhoades video

# ourtime login canada 2024/03/04 10:19 RodrigoGrany

https://evaelfie.pro/# eva elfie izle

# lana rhoades unleashed - https://lanarhoades.pro/ lana rhoades boyfriend
2024/03/06 13:38 LanaRho

lana rhoades unleashed - https://lanarhoades.pro/ lana rhoades boyfriend

# eva elfie new videos https://evaelfie.site/ eva elfie full videos
2024/03/07 1:59 EvaElfie

eva elfie new videos https://evaelfie.site/ eva elfie full videos

# chatting dating site 2024/03/10 5:37 HowardBox

good free dating wesbites: https://lanarhoades.pro/# lana rhoades solo

# sweet bonanza slot demo https://sweetbonanza.bid/ - g&#252;ncel sweet bonanza
2024/03/27 19:26 Bonanzaj

sweet bonanza slot demo https://sweetbonanza.bid/ - g&#252;ncel sweet bonanza

# gates of olympus oyna ucretsiz 2024/03/29 7:48 KeithNaf

https://pinupgiris.fun/# pin up 7/24 giris

# doxycycline order online 2024/04/12 5:58 Archiewef

https://doxycyclinest.pro/# generic doxycycline

タイトル
名前
URL
コメント