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;
}
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 立花 晃@鎌ヶ谷市
やはりそうでしたか。
どうもありがとうございます。
> > sqrt をニュートン法で誤差が十分小さくなったら終了とし、
> > 誤差がでる処理系があるのではないかと思いまして。
> > ちなみに、いくつか実験したら真でした。
>
> 手元(gcc version 2.95.3, glibc 2.2 on Plamo Linux2.2.6)で
> Fujii さんのテストプログラムを動かしてみたら、
立花さんのテストをみて気づいたのですが、
123.456ってのは2進数では循環小数でまともに2乗できない数値でした。
---
藤井宏憲