C++将双精度中的每个小数点制作成数组元素
C++ making each decimal in a double into array elements?
(这是为了练习(我正在尝试创建一个程序,该程序采用像 1.2041 这样的双精度数,并将每个小数点转换为数组中的一个元素。
通过循环,我希望数组的结尾如下所示:ar[0] = 0.2; ar[1] = 0.00; ar[2] = 0.004; ar[3] = 0.0001;
之后,我将把小数加在一起,最终得到 0,2041,但我似乎找不到任何方法来单独接触每个小数。
我尝试过乘减,但我似乎无法让它工作。
有谁知道一种简单的方法,可以将双精度中的每个小数变成数组中自己的单独元素?
除非你热衷于实现Dragon4(参见Guy L.Steele Jr.和Jon L.White的"如何准确地打印浮点数"(,否则你最好将double
值格式化为字符串,例如,使用std::to_string()
,并从中计算相应的数字值[近似值]。
当在double
中用小数位表示十进制值时,通常使用二进制浮点表示表示,该值通常会四舍五入。例如,不可能使用 double
准确表示0.1
。相反,将存储最接近的可表示值。当使用适当的算法来恢复十进制表示形式时,例如 Dragon4 或 Grisu(后者通常更快,但据我所知有时会回退到 Dragon4(,原始四舍五入会被考虑在内。这些算法在某种程度上是不平凡的。你可以在David Gay的dtoa.c
中找到Dragon4变体的来源。您可能想在文章中查看更多详细信息 这里是龙:你甚至不知道自己遇到的问题的进步。
当您使用天真的方法试图推断每个数字时,您会得到一个值,但充其量您得到的是double
实际表示的值。例如,您的值1.2041
表示为 1.204099999999999948130380289512686431407928466796875
。查看值如何表示的最简单方法是使用 IEEE-754 分析:获取两个分析器,将值输入到第一个分析器中,采用十六进制表示形式(在您的情况下为 3FF343FE5C91D14E
(,然后将其转储到第二个分析器中。它将显示double
使用的确切十进制值。
如果你乘以 10^n,并将结果变成一个 int,你会得到整数,直到想要的小数。如果你得到这个数字的余数除以 10,你将只得到这个数字。
然后,你用 10^n 除以得到小数:
(double)((int)(number/pow(10,n))%10)/pow(10,n)
这应该可以解决问题。
注意:此代码需要"math.h",数字是整数,n 是小数。 n=1 是第一个小数。
注2:正如Dietmar Kühl所指出的,这段代码在最后一位小数点上存在问题,如下所示: http://ideone.com/xOracn 我正在寻找解决方法或修复程序。
- 数组元素打印的递归方法
- 如何将字节数组元素替换为修改的十六进制 ASCII 符号?
- 为什么使用数组元素查找最大数字的程序不起作用?
- 数组元素更改值?
- 如何访问宏中定义的数组元素
- 将数组元素递增 1
- C++函数,它将数组、谓词和运算符作为参数,并将运算符应用于满足谓词的数组元素
- 存储指向动态数组元素的指针
- C++通过别名指针以静默方式将错误的类型分配给数组元素
- 在 std::map 中插入数组元素
- 使用指针访问数组元素时出现意外结果
- c++ 使用动态分配运算符反向数组元素
- 为什么在 c++ 中分配 char 数组元素时,分配的字符会被销毁?
- 缺少数组元素问题
- 如何在类中制作 2D 数组元素,然后在其构造函数中指定其维度?
- 创建一个函数来转换数组元素的类型并返回数组的地址
- 删除在结构 c++ 中声明的数组元素
- Getter 和 Setter 用于类 C++ 中的数组元素
- 尝试递归获取数组元素的总和
- 使用SWIG将numpy数组元素(int)传递给c++int