Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

sqrt (x*x) == x

3 views
Skip to first unread message

Fujii Hironori

unread,
Aug 23, 2003, 3:50:12 AM8/23/03
to
sqrt (x*x) == x が真となることを前提としたプログラムを見たのですが、
真となるものですか。

sqrt をニュートン法で誤差が十分小さくなったら終了とし、
誤差がでる処理系があるのではないかと思いまして。
ちなみに、いくつか実験したら真でした。

#include <stdio.h>
#include <math.h>

#define test(x) printf ("%s " #x "\n", sqrt (x*x) == x ? "t" : "f")

int main (void)
{
test (3.0);
test (3);
test (123.456);

return 0;
}

R4000 2.2

unread,
Aug 23, 2003, 4:43:05 AM8/23/03
to
こんにちは、立花@鎌ヶ谷市です。

Fujii Hironori <fu...@chi.its.hiroshima-cu.ac.jp> writes:

> sqrt (x*x) == x が真となることを前提としたプログラムを見たのですが、
> 真となるものですか。

常には成り立たないと思います。

> sqrt をニュートン法で誤差が十分小さくなったら終了とし、
> 誤差がでる処理系があるのではないかと思いまして。
> ちなみに、いくつか実験したら真でした。

手元(gcc version 2.95.3, glibc 2.2 on Plamo Linux2.2.6)で
Fujii さんのテストプログラムを動かしてみたら、

t 3.0
t 3
f 123.456

でした。
もちょっと試すと、

t 3.0
t 3
f 123.456
f 123.2
t 123.25
t 123.5
t 123.75
f 123.8

です。

--
ta...@kc5.so-net.ne.jp 立花 晃@鎌ヶ谷市

Fujii Hironori

unread,
Aug 23, 2003, 5:17:26 AM8/23/03
to
At 23 Aug 2003 17:43:05 +0900,

R4000 2.2 wrote:
>
> こんにちは、立花@鎌ヶ谷市です。
>
> Fujii Hironori <fu...@chi.its.hiroshima-cu.ac.jp> writes:
>
> > sqrt (x*x) == x が真となることを前提としたプログラムを見たのですが、
> > 真となるものですか。
>
> 常には成り立たないと思います。

やはりそうでしたか。
どうもありがとうございます。

> > sqrt をニュートン法で誤差が十分小さくなったら終了とし、
> > 誤差がでる処理系があるのではないかと思いまして。
> > ちなみに、いくつか実験したら真でした。
>
> 手元(gcc version 2.95.3, glibc 2.2 on Plamo Linux2.2.6)で
> Fujii さんのテストプログラムを動かしてみたら、

立花さんのテストをみて気づいたのですが、
123.456ってのは2進数では循環小数でまともに2乗できない数値でした。

---
藤井宏憲

0 new messages