高精度金属器件

13

背景

$\frac{n\pm\sqrt{4+n^2}}{2}$

$\frac{n+\sqrt{4+n^2}}{2}$

$\frac{1+\sqrt{5}}{2}$

挑战

• n是一个自然数，表示哪个金属均值
• p是一个自然数，表示精度的小数位数

有效期

digit.s（不带空格）

1.618033988

$\frac{1+\sqrt{5}}{2}$

排行榜

（使用Martin的页首横幅代码段

17

直流电，12

``````?kdd*4+v+2/p
``````
• `?` 将n和p压入堆栈
• `k` 将精度设置为p
• `dd` 重复n次（总共3次）
• `*` n * n相乘
• `4+` 加4
• `v` 扎根
• `+` 加n（堆栈上的最后一个副本）
• `2/` 除以2
• `p` 打印

测试用例：

``````\$ dc -f metalmean.dc <<< "1 9"
1.618033988
\$
``````

7

5
@Dennis必将成为CJam的第一次，几乎是其他时间的三倍；-)
Digital Trauma

2

R，116字节

``library(Rmpfr);s=scan();n=mpfr(s[1],1e6);r=(n+(4+n^2)^.5)/2;t=toString(format(r,s[2]+2));cat(substr(t,1,nchar(t)-1))``

``````# Import the Rmpfr library for arbitrary precision floating point arithmetic
library(Rmpfr)

# Read two integers from STDIN
s <- scan()

# Set n equal to the first input as an mpfr object with 1e6 bits of precision
n <- mpfr(s[1], 1e6)

# Compute the result using the basic formula
r <- (n + sqrt(4 + n^2)) / 2

# Get the rounded string representation of r with 1 more digit than necessary
t <- toString(format(r, s[2] + 2))

# Print the result with p unrounded digits
cat(substr(t, 1, nchar(t) - 1))``````

1

Mathematica，50个字节

``````SetAccuracy[Floor[(#+Sqrt[4+#^2])/2,10^-#2],#2+1]&
``````

@不幸的是，我不能使用机器精度数字，因为它们无法处理`p>15`
2012rcampion 2015年

1

CJam，35个字节

``````1'el+~1\$*_2#2\$2#4*+mQ+2/1\$md@+s0'.t
``````

CJam解释器中在线尝试。

怎么运行的

``````1'e  e# Push 1 and 'e'.
l+   e# Read a line from STDIN and prepend the 'e'.
~    e# Evaluate. This pushes 10**p (e.g., 1e3 -> 1000) and n.
1\$*  e# Copy 10**p and multiply it with n.
_2#  e# Copy n * 10**p and square it.
2\$   e# Copy 10**p.
2#4* e# Square and multiply by 4.
+    e# Add (n * 10**p)**2 and 4 * 10**2p.
mQ   e# Push the integer part of the square root.
+2/  e# Add to n * 10**p and divide by 2.
1\$md e# Perform modular division by 10**p.
@+s  e# Add 10**p to the fractional part and convert to string.
0'.t e# Replace the first character ('1') by a dot.
``````

1

Python 2，92字节

``````n,p=input()
e=10**p;r=0
while(n*n+4)*e*e>r*r:r+=1
s=str((n*e+r-1)/2);print s[:-p]+'.'+s[-p:]``````

1

PHP，85 78字节

``````echo bcdiv(bcadd(\$n=\$argv[bcscale(\$argv[2])],bcsqrt(bcadd(4,bcpow(\$n,2)))),2);
``````

@黑洞 确实是85岁。我可能已经读过86（选择范围稍大），但误写了68。立即修复。
axiac 2015年

1

Blackhole，2015年

1

Blackhole，2015年

axiac 2015年

1

J，27字节

``````4 :'}:":!.(2+x)-:y+%:4+*:y'
``````

说明：

``````4 :'                      '   | Define an explicit dyad
*:y    | Square y
%:         | Square root
-:             | Half
":!.(2+x)               | Set print precision to 2+x
}:                        | Remove last digit, to fix rounding
``````

``````    9 (4 :'}:":!.(2+x)-:y+%:4+*:y') 1
1.618033988
``````

``````4 :'}:":!.(2+x){.>{:p._1,1,~-y'
``````