UVA12413 Big Decimal Calculator
题目描述
一些像 Java 一样的语言有高精度十进制计算库支持基础的算数操作,比如加减乘除。然而,科学问题通常需要计算数学函数像 $\sin$,$\cos$,等等。在这个问题中,你需要实现一个高精度十进制计算器。
这里有 $15$ 种运算:
- 二元运算:`add`,`sub`,`mul`,`div`,`pow`,`atan2`
- 一元运算:`exp`,`ln`,`sqrt`,`asin`,`acos`,`atan`,`sin`,`cos`,`tan`
三角函数使用弧度制。
输入格式
输入最多有 $100$ 行。每行由一个操作名开始,然后是参数,接下来是精度 $p(1\le p\le50)$。每一个参数都是一个或多个数字,然后是一个小数点,接下来又是是一个或多个数字。整数部分不会省略,但是小数点和小数部分可能一起被省略。参数前可能会有一个负号。输入的每个数最多有 $20$ 位小数。在 `pow`,`exp`,`ln` 和 `sqrt` 函数中,所以参数都严格为正。在 `asin` 和 `acos` 函数中,参数的整数部分一定是零。
输出格式
对于每一行,输出答案,四舍五入保留到小数点后 $p$ 位(不要使用科学计数法!)。保证答案是有限数,并且答案的整数部分不会超过 $10$ 位。
说明/提示
你可能注意到这个问题不是语言中立的。我的意思是,一些编程语言比另一些语言更有优势。这是有意的:现实世界中软件开发就像这样。选择编程语言,库和整体架构可能很重要。
在这个话题上有相当多的文献(比如 Bruno Haible 和 Thomas Papanikolaou(译者注:这两个人我没搜找到他们具体干了什么,如果有人找到了可以把内容私信发我或发在讨论区,谢谢)的一系列快速高精度有理数计算),但用这些算法可能适得其反。这个问题的时间限制相当宽松,并且测试数据也不强:这个问题的目标是取实现一个能正常工作的程序,而不是一个完美的程序,所以尝试写一个简洁的代码,这通常更容易写并且更好调试。
如果你需要更多的可实现的文献,可以看这里:[https://www.tc.umn.edu/.ringx004/sidebar.html](https://www.tc.umn.edu/.ringx004/sidebar.html)(译者注:这是一个明尼苏达大学的网站,但是我上不去,显示 Permission denied,如果有人能上去可以把内容私信发我或发在讨论区,谢谢)。这个文章讲述如何变换参数使级数收敛更快。虽然你找不到完整的解决方案,但是你会有一些好主意的。
由 bcdmwSjy 翻译。