-2

我正在创建一个程序,该程序需要找到数千个单独的百分位数,其中大部分小于 0.00005。目前,为此我使用

0.5 * erfc(-zScore * M_SQRT1_2)

然而,这似乎略微四舍五入(在我的程序的其余部分我使用双打和长双打,所以它必须是这个)。我相信这是因为最后,当我将所有百分位数相加时,我得到 1.835468。这告诉我它正在四舍五入,因为它应该加起来 1,或者至少是一个非常接近 1 的数字。此外,当我记录每个单独的百分位数时,我得到相同的数字(比如 0.000036)几个百分位数,并且然后它下降到 0.000035。每次都应该下降,因为每个数字都比上一个数字离平均值更远。

我需要一种方法来根据 Z 分数找到非常精确的百分位数,这并没有给我,因为它舍入得太早了,在小数点后 6 位。

4

2 回答 2

1

当你看到它从 0.000036 跳到 0.000035 时,这是因为你需要使用NSLog(@"Value is: %0.36f", yourPercentile);. 您应该会发现它实际上并没有以 6 位四舍五入,但这就是它的记录方式。

现在,您的错误来自您使用双精度数的事实,它不能很好地存储精确值。首先,您需要知道您需要多少精度,然后使用可以处理该精度级别的类型。

假设您决定需要 12 位精度。

long long 是一个很好的单位,因为它可以存储 19 位数字。当您计算原始值时,您需要将原始值乘以 100,000,000,000 并将它们存储为 long long。然后使用大值进行您需要的数学运算。最终,当您得到结果时,只需除以相同的值(如果您想将其视为整数,则减去 2 位)即可得到您的百分比。

于 2013-01-12T18:55:30.317 回答
0

我相信这是格式化数字的问题:如果两个值(long double)彼此非常接近但仍然不同,您会看到它们相等,请使用“%.12Lf”之类的格式指定格式。

于 2013-01-12T18:27:58.997 回答