• 締切済み

PHPでε(イプシロン)のような定数はありますか?

C言語では、 >1.0 + ε > 1.0 となる最小の値ε >#define FLT_EPSILON 1.19209290E-07F >#define DBL_EPSILON 2.2204460492503131E-16 >#define LDBL_EPSILON 1.084202172485504434e-019L のような形で定義されているそうですが、 PHPにおいてはそのような値は定義されているのでしょうか? そもそも小数点以下を評価(比べる)する際に C言語などと違う点はどこらへんでしょうか?

  • PHP
  • 回答数1
  • ありがとう数1

みんなの回答

  • wp_
  • ベストアンサー率54% (132/242)
回答No.1

cで使われるごくごく小さい数は「機械イプシロン」と言うらしいですね。 // 知らなかった 一晩待って誰も突っ込まない、「機械イプシロン PHP」で検索・ぐぐってもそれらしい記事がないところをみると 該当する機能はないのではないかと思います。 ただphp自身がcで記述されているので、独自拡張すれば使えないこともないのではと思います。 手間はすごく掛かりますが・・・ むしろ、php内でそういう機能を実装するのもアリかもしれませんね。

takagoo100
質問者

お礼

ご返答ありがとうございます。 マニュアルにサンプルのようなものがありました。 自分で定義してるみたいですね。 見た感想としてはC言語と同じような感じだろうか > define('EPSILON', 1.0e-8); function real_cmp($r1, $r2) { $diff = $r1 - $r2; if( abs($diff) < EPSILON ) return 0; else return $diff < 0 ? -1 : 1; } >

takagoo100
質問者

補足

URL忘れました・・・ ここです http://jp.php.net/manual/ja/language.types.float.php

関連するQ&A

  • float.h のテスト結果がおかしい

     float.h  をテストするため、次のようなプログラムを作りました。  float.h に書かれている値が書き出されると思ったのですが、少し値が違います。  FLT_MAX と DBL_MAX の値が違っています。本当にこのヘッダファイルを読んでいるかと思い、 #define FLT_MAX 3.4e+3f    と変更すれば、 Max= 3.400000000000000000E+03 と出てきます。  一致しない原因は何でしょう。  コンパイラはルネサスのHEWで、CPUはH8/3052です。 *** float.h *** #define FLT_MAX 3.4028235677973364e+38f #define FLT_MIN 1.175494351e-38F #define DBL_MAX 1.7976931348623158e+308 #define DBL_MIN 2.2250738585072014e-308 *** プログラム *** sprintf(str," float :%ldBytes Max= %.18E Min= %.18E\r\n", sizeof(float), FLT_MAX, FLT_MIN) ; Put_str(str) ; sprintf(str," double:%ldBytes Max= %.18E Min= %.18E\r\n", sizeof(double), DBL_MAX, DBL_MIN) ; Put_str(str) ; *** 結果 *** float :4Bytes Max= 3.402823466385288600E+38         Min= 1.175494350822287500E-38 double:8Bytes Max= 1.797693134862315700E+308          Min= 2.225073858507201400E-308 *** まとめて整理 ***  元の原稿は比較し易いように縦に数字が並ぶように書いているのですが、 ここに書き込むとずれてしまいます。 #define FLT_MAX 3.4028235677973364e+38f         Max= 3.402823466385288600E+38  FLT_MIN に比べ有効桁数が多いのが気になる。  同じ有効桁数で区切っても ...567 と ...466 とでは誤差が大きい。    FLT_MAX 3.402823567 7973364e+38f       Max= 3.402823466 385288600E+38     FLT_MIN 1.175494351e-38F #define FLT_MIN 1.175494351e-38F         Min= 1.175494350822287500E-38  四捨五入なら分かる。 #define DBL_MAX 1.7976931348623158e+308         Max= 1.797693134862315700E+308  最後が8と7で違う。しかし、DBL_MAX は8バイトで表せる値に対して四捨五入したために7が8になったと考えれば納得出来る。 #define DBL_MIN 2.2250738585072014e-308         Min= 2.225073858507201400E-308  ピッタリ合っている  宜しくお願いします。

  • 浮動小数点数の float型 での最少値について調べています。

    浮動小数点数の float型 での最少値について調べています。 「Visual C++ 2008 Express Edition」の「float.h」の中には、    #define FLT_MIN     1.175494351e-38F   /* min positive value */    #define FLT_MIN_EXP  (-125)           /* min binary exponent */ という記述があります。 float型で表現できる最少値が「1.175494351e-38F」なのだろうと思い、 下記のように 2^-125 を計算してみました。    printf("結果は、「%e」です。", pow((double)2, (double)(-125))); 実行結果は、    結果は、「2.350989e-038」です。 となり、「float.h」の「FLT_MIN」には一致しませんでした。 試しに、下記のようにしてみると( 2^-125 を 2^-126 に変えてみました )    printf("結果は、「%e」です。", pow((double)2, (double)(-126)));    結果は、「1.175494e-038」です。 となって「float.h」の「FLT_MIN」と「ほぼ一致」しているように見えます。 float型での最小値(FLT_MIN)を計算する際に「float.h」での「FLT_MIN_EXP」を使って    2^-125 とするのは間違っているのでしょうか?

  • C言語イプシロン値

    現在使用中の開発環境(C言語使用)標準ヘッダfloat.hに単精度浮動小数点数イプシロン値が下記のように定義されています。 #define  FLT_EPSILON   0x8p-26F 「0x8p-26F」なる表現を初めて見たのですが、これはどういう意味で、具体的にどんな数字になるのでしょう? ご存じの方、教えてくださいませ。 よろしくお願いします。

  • PHP5でクラス定数が使えますが

    PHP5でクラス定数が使えますが 以下のようにFで A + Eや A | Eなどとすると、 Parse errorとなります。 クラス定数は数値、文字列、配列のみで、組み合わせは不可という仕様で良いのでしょうか? PHP5の仕様書というものはネット上で存在しているのでしょうか? 英語でも構いませんので、ご存知の方教えてください。 class Test { const A=1; const B="2"; const C=array(3); const E=4; const F=A+E; // ここでエラー } この場合の対策ですが、素直にPHP4のように defineを使えば良いでしょうか?

    • ベストアンサー
    • PHP
  • PHPの関数定義ついて。

    PHPの関数定義ついて。 初歩的な質問かもしれませんが、 define関数での定数定義が、スクリプト実行時に評価されるのはなぜでしょうか。 なぜコンパイル時ではなくスクリプト実行時に評価しなければならないのでしょうか。 また、const文によるクラス定義が、コンパイル時に評価されるのはなぜでしょうか。 なぜクラス定義はコンパイルに評価しても問題ないのでしょうか。

    • ベストアンサー
    • PHP
  • C初心者です

    学校でC言語を習い始めたばかりの初心者です。以下のプログラムを作成したいのですが、お教え願います。ちなみに授業では整数型の変数を定義してなんちゃらとか、printfというところまでしかやってません。 1、5人の身長の平均を求めるプログラム(小数点以下切捨て) 2、1の人数5に対してNUMBERというマクロ名を与え、プログラムを書き換えよ。(#defineで定義とか言うひヒントがかいてありました) 3、#defineによるマクロ名を使うメリットは何か? という3つです。 1は変数を5個定義してやればいいんですかね?それを全部足して5で割って…、でいいんでしょうか? 2,3はまったく分かりません。 かなり簡単な質問かとは思いますが、なにぶん始めたばかりなものなので、お教え願います。 できたらプログラムリストを示していただきたいです。 宜しくお願い致します。

  • 小数点の誤差をなくすのは可能?[ExcelとPHP]

    PHPとExcelのワークシート関数を使って小数点の演算を行い、 両者が正しい値を返しているかを比較しているのですが、 どうしても計算が合いません。 例えば、次のような計算です(小数点は少数点以下第4位まで に統一されています)。 0.0034×0.2313×1.7423=?? PHPとExcelのそれぞれにおいて、小数点以下の計算に限界が あるのは、理解しました。 ということは、PHPとExcelで上記のような計算を正しく同じ値にするのは不可能なのでしょうか? それとも、PHPとExcelのそれぞれにおいて、ROUND関数などを駆使 すれば解決可能なのでしょうか? 演算の工夫で解決できる問題なのか、そもそも不可能な問題なのか を教えていただけたら幸いです。

  • PHPの式について

    かなり基本的な事柄なのですが PHPにおいて【式】とは http://php.net/manual/ja/language.expressions.php の冒頭にある >式は、PHP における最も重要な基盤石です。PHPにおいては、ほとんど全てのものは式で記述されます。最も簡単で最も正確な式の定義は、"全ての式には値がある。" です。 とありますが、つまりは式とは評価したとき返り値を持つものと解釈してもよいのでしょうか? 例をあげると $hoge = 5; //これは式 print $hoge;//これも式 echo (print $hoge); //これも式 print (print $hoge); //これも式 echo (echo $hoge); //これは?実行するとパースエラー なぜ一番最後の例のみパースエラーなのでしょうか? 調べてみると【print】関数・・・というよりprintという言語構文ですか これはどうも常に1という値を返すみたですね。 つまり、本質問の冒頭で申した通り、帰り値を持つものが式とするならば この echo (echo $hoge); は式ではない。 ということになりますか? 以上、ちょっと根本的すぎますが ご教授ください。

    • ベストアンサー
    • PHP
  • Wordで定義値の機能ありませんか?

    Word2007で決められた値を決められた箇所で参照するようなことはできないでしょうか? イメージ的にはC言語とかのdefine定義みたいな感じです。 任意の場所にhogeはHOGENHOGENと定義しておいて、その値を表示したいときはhogeを使って・・・ HOGENHOGENの値をHOHOGE-Nに変えたくなったときは、定義してる場所だけ変えるとhogeを使ってるところすべてが全部HOHOGE-Nに変わってくれるようなものです。 フィールドを使えばできそうな気がするんですが、具体的な方法が分かりません。 どなたかわかる方教えていただけないでしょうか?

  • apache,ruby(PHP),cの連携について

    C言語で書いたプログラムをプロセスとして立ち上げておいて、Rubyからそのプロセスに値を渡してCのプログラムを実行することは可能でしょうか。 以下に、現在の構成とやりたいことを記載します。 【構成】 OS:CentOS httpd:apache 使用言語:Ruby(or PHP)、C言語(OpenCV) 【やりたいこと・概要】 ユーザがブラウザからパラメータを入力し、そのパラメータを元にサーバで画像処理を行い、その結果をユーザへXMLで返したい。 その際に、画像処理を行うプログラム(C言語)では、ディスクから大量のデータをメモリにロードするため、処理時間がかかります。そこで、C言語はプロセスとして常に上げておくことで、メモリへのロード時間を削減したい。 【やりたいこと・流れ】 1.ユーザが、ブラウザから値を入力し、POSTする 2.Ruby(or PHP)で受け取る 3.受け取った値をC言語で書かれたプログラム(OpenCVを利用した画像処理プログラムで、これをプロセスとして常に上げておきたい)へ連携する 4.連携された値を元に画像処理を行い、処理結果をRuby(or PHP)へ返す 5.Ruby(or PHP)で受け取った情報をXMLにして、ユーザへ返す ※ Ruby(or PHP)と書いた部分はC言語をプロセスとしてあげておいてPOSTを受け取ることが出来ればC言語での実装でも構いません。 乱文になってしまい読みづらくて申し訳ありません。 情報の過不足などが有りましたらご指摘をお願いします。 お分かりになる方、ヒントでも構いませんので教えて頂ければ幸いです。 以上です。よろしくお願い致します。