質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

解決済

1回答

1227閲覧

PHPのmicrotime()関数がわからない

aaaaaaaa

総合スコア501

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

0クリップ

投稿2017/09/14 10:17

編集2017/09/15 10:04

phpのmicrotime()について質問ですが、PHPマニュアルによると
引数に真偽値を指定しなければ1970年1月1日から今この瞬間までの時間を秒数にした値とそれをマイクロ秒にした秒数を一緒に表示し、trueを引数に与えれば浮動小数点数で返すそうです。
ここでいくつか質問があります


引数に何も指定しなかったときに表示される「マイクロ秒 秒」のマイクロ秒は、PHPマニュアルによれば

msec は sec から経過したマイクロ秒数を秒単位で表したものです。

とあります。例えば今、関数を実行すると「0.26299500 1505382259」となります。
マイクロ秒数というから「マイクロ秒 秒」の秒の部分を10^6で乗算したものだと思っていたのですが、関数を実行して分かる通り違います(1.505382259e+15マイクロ秒)。この「0.26299500」という小数点の塊についてPHPマニュアルなどを参照してもよく理解できません。0.26299500とはいったい何なのでしょうか。引数に真偽値を渡すと秒のあとの小数点の数字が0.26299500となります。しかし、これでもよくわかりません。


PHPマニュアルにおいてですが、マイクロ秒は、μsなのになぜmsecと表示するのでしょうか。μsecではダメな理由があると思うのですがそれは何なのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

1について、microtime()はUNIXTIMEをマイクロ秒まで返す関数です。

引数がfalseの場合は、2つの数値のうち後者が秒単位のUNIXTIMEで、
前者はマイクロ秒単位まで出力された1秒未満の経過秒数です。
足し合わせると関数実行時点のマイクロ秒単位でのUNIXTIMEとなります。
引数がtrueの場合は、上記の2つの値を足しあわせて小数で返却しますが、
精度が問題になる場合があります。

下記のように出力すると、実行時は秒数の部分が同じになりました。

PHP

1<?php 2print microtime(false) . "\n"; 3// ⇛ 0.73686800 1505391966 4print microtime(true) . "\n"; 5// ⇛ 1505391966.7478

2について、μは全角文字のため、英語圏では使用されにくいのだと思います。
マイクロ秒はusec等と表記される場合もあり、msecだけではミリ秒なのか
マイクロ秒なのか等がわかりづらいですが、ドキュメント中で説明されているmsecは、
「"msec sec" 形式の文字列」の説明で触れている部分ですので、
変数名と同じような扱いで名付けの問題かと思います。

投稿2017/09/14 12:39

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aaaaaaaa

2017/09/15 10:04

ご回答ありがとうございました。 つまり、引数に何も指定しない(false)だと小数点部分(0.73686800)を秒として表したものと、整数部分(1505391966)を秒として表示したものが返ってきて、それらを足し合わせると マイクロ秒単位で1970年1月1日からの経過秒数が分かると。 trueにすると少々精度に問題があるものの先ほど加算したものよりは、正確なマイクロ秒数が返ってくる、ということでしょうか。間違っていたら申し訳ありません。
退会済みユーザー

退会済みユーザー

2017/09/15 10:30

> マイクロ秒単位で1970年1月1日からの経過秒数が分かる ご認識の通りです。 > trueにすると少々精度に問題があるものの先ほど加算したものよりは、正確なマイクロ秒数が返ってくる 引数がtrueの方がより正確、というのは誤りでは無いかと思います。 そうであれば文字列で値を返却する必要も特にありません。 32bitの浮動小数点数では精度が7桁程度なのでマイクロ秒までの精度を保証できないため、現在のような実装になっているのではないかと思います。
aaaaaaaa

2017/09/20 10:31

ご回答ありがとうございます。 重ね重ね申し訳ありませんが、もう一つ質問させてください。 true、falseともに優劣があまりないということですが、なぜ返り値が二つあるのでしょうか。 何か理由があってtureの返り値、falseの返り値があると思うのですが。
退会済みユーザー

退会済みユーザー

2017/09/20 12:37

今となっては歴史的経緯によるものとしか言えないかと思います。 https://github.com/php/php-src/blob/master/ext/standard/microtime.c 現在の実装では、精度や速度によるどちらか一方の優位性も特になさそうです。 microtime関数が引数を取るようになったのはPHP5からのようなので、もともとは文字列表現でしか取得する方法がなかったものが、floatでも取得できるようになった。ただし、後方互換性を保つため、引数がない場合のデフォルト値は文字列表現を返すもののままとなっている、のだと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問