トップ 最新 追記

U-memo

2006|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|08|
2009|08|10|
2010|02|03|
2011|11|12|
2012|04|
2016|02|
All= / Today= / Yesterday=

2010-03-18 [長年日記]

_ [����] log 0.0

�Ȥ������Ȥǡ�log(0) �� EDOM �Ǥ� ERANGE �Ǥ⤤���äݤ��Ǥ��ͤ�

�㤦�衢����ϰ㤦�衣Sun ����ѥ��餬���äƤ���Τϡ��פ����

  • SVID �� X/Open ξ���ʤ��׵᤹���̤����פ��ʤ����顢���ʤ��������Ƥ��줿�餽�δ����̤�ν��Ϥ��Ƥ�����

�Ǥ��äơ�SVID ����ʤ� EDOM ������X/Open ����ʤ� ERANGE���Ǥ� (�ǥե���Ȥ� X/Open)�� �ɤä��⸶���ʤˤ����äƤ��ʤ��Τǡ�shall �ʤΤ� should �ʤΤ��Τ�ޤ��󤱤ɡ�

log(0.0) �η�̤� printf ��ɽ������褦�ˤ��ơ� ����ˤ�ä��Ѥ���ͤ򼨤��Ƥ����ޤ���

% cat log.c
#include <math.h>
#include <errno.h>
#include <stdio.h>

int main(int ac, char **av)
{
  double d;
  d=log(0.0);
  perror("");
  printf("%d\n", errno);
  printf("%f\n", d);
}
% cc -lm -Xt log.c
% a.out
log: SING error
Argument out of domain
33
-340282346638528859811704183484516925440.000000
% cc -lm -Xa log.c
% a.out
Result too large
34
-Inf

¾�˴ط����뵬�ʤε���Ϥ���ʴ�����

  • C99:���Ͱ襨�顼�ˤʤ뤳�Ȥ⤢���(����襨�顼�ˤϤʤ�ʤ�)
  • IEEE754: �������Ǥ���(log �������� [0,+��]) ����ͤ� -Inf ���Ȥ���Τ��侩 (recommended)��

�������äơ��Ķ����ɤε��ʤ˽�򤷤Ƥ���Τ��ǡ�����襨�顼�ˤʤ뤫�Ͱ襨�顼�ˤʤ뤫���㤦�辰�Ǥ�����������襨�顼�ˤʤ�ΤϤ᤺�餷���褦�ʡ�

�ʤ����ɤ�Ǥ⡢log(-1) ������襨�顼�Ǥ���

_ [����] �ĤŤ���

python �θ���������Ƥߤ��Τ���

import math
for x in range(0, 10):
  z = 10 ** int(math.log10(x))
  if x > z and x % z:
    continue
  print(x)

���ä���Ʊ���Ķ�����

% python log.py
Traceback (most recent call last):
  File "log.py", line 3, in <module>
    z = 10 ** int(math.log10(x))
OverflowError: math range error

�դࡣ���ä��� log(0.0) �η�� (-Xa) ��Ʊ����

�̤δĶ�

% gcc -lm log.c
% a.out
Numerical result out of range
29
-inf

���äȡ�errno ����񤭤���Ƥ롣perror() �� errno ɽ����Ҥä��꤫������

% a.out
34
Numerical result out of range
-inf

���δĶ��ǡ�

% python log.py
Traceback (most recent call last):
  File "log.py", line 3, in <module>
    z = 10 ** int(math.log10(x))
ValueError: math domain error

Huh? �����ϲ��򤤤äƤ���Τ��� ���ʤߤ� ruby ���Ȥ������ʤ��ȤˤϤʤäƤ��ʤ���

% ruby -e 'print Math.log(0.0)'
-e:1:in `log': Numerical result out of range - log (Errno::ERANGE)
        from -e:1
本日のツッコミ(全1件) [ツッコミを入れる]

_ ����� [����.org �����ˤ�᡼�뤷�ޤ������������ϵٹ֤ˤʤ�ޤ����� ��ä���٤�Ǥ���..]