Stata numlist中的有效数字位数

时间:2017-11-16 17:57:17

标签: double stata precision

(注意:此问题也发布了here

看起来Stata的numlist会将小数截断为13个无效数字。

program test
    syntax, q(numlist)
    disp "`q'"
    if ( (`q' - 0.1234567890123456789) == 0 ) {
        display "Stuff here should be executed"
    }
    else {
        display "Stuff here should not be executed"
    }
end

产生

. test, q(0.1234567890123456789)
.1234567890123
Stuff here should not be executed

有可能避免这种行为吗?当然我在我的程序中使用numlist,因为我也可以传递像q(0/10)这样的东西等等。所以,例如,我遇到的现实问题是这样的:

foreach qq of numlist `=100 * 9090 / 100001'(`=100/100001')`=100 * 9092 / 100001' {
    if ( (floor(`qq' * 99990 / 100) - `qq' * 99990 / 100) == 0 ) {
        display "Stuff here should be executed if = to 0"
    }
}

什么都没显示。但是,这是不正确的。

scalar s1 = `=100 * 9090 / 100001'
scalar s2 = `=100 * 9091 / 100001'
scalar s3 = `=100 * 9092 / 100001'

scalar comp1 = (floor(`=scalar(s1)' * 99990 / 100) - `=scalar(s1)' * 99990 / 100)
scalar comp2 = (floor(`=scalar(s2)' * 99990 / 100) - `=scalar(s2)' * 99990 / 100)
scalar comp3 = (floor(`=scalar(s3)' * 99990 / 100) - `=scalar(s3)' * 99990 / 100)

if ( `=scalar(comp1)' == 0 ) display "execute if comp1 == 0"
if ( `=scalar(comp2)' == 0 ) display "execute if comp2 == 0"
if ( `=scalar(comp3)' == 0 ) display "execute if comp3 == 0"

正确显示

execute if comp2 == 0

使用标量成功的numlist失败的原因是因为(100 * 9091/100001)是9.09 ...重复,而不是9.090909090909,这是numlist看到的(13位有效数字)。我们可以看到:

foreach qq of numlist `=100 * 9091 / 100001' {
    disp %18.15f `qq'
}
disp %18.15f 9.090909090909
disp %18.15f (100 * 9091 / 100001)

可生产

 9.090909090908999
 9.090909090908999
 9.090909090909092

第三个数字(我想要的那个)与另外两个不同。

0 个答案:

没有答案