Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:使用大数值(>;1 mrd.)和过程进行计算_C++_Floating Point_Integer_Double_Precision - Fatal编程技术网

C++ C++;:使用大数值(>;1 mrd.)和过程进行计算

C++ C++;:使用大数值(>;1 mrd.)和过程进行计算,c++,floating-point,integer,double,precision,C++,Floating Point,Integer,Double,Precision,我想使用当前值的百分比来计算元素的价格。例如:一个苹果现在的价格是4美元,每买一个苹果,价格就会上涨7%。因此,第一个苹果的售价为4美元,下一个为4.28美元(价格为4美元的7%),下一个为4.58美元(价格为4.28美元的7%),依此类推。 我的脚本在某种程度上起了作用,但随着数字的增加,我很难找到合适的数据类型。 因为我必须四舍五入到最后两位数,所以我会这样做: int64_t c = 0; double ergebnis = 0; double komma1 = 0; komma1 =

我想使用当前值的百分比来计算元素的价格。例如:一个苹果现在的价格是4美元,每买一个苹果,价格就会上涨7%。因此,第一个苹果的售价为4美元,下一个为4.28美元(价格为4美元的7%),下一个为4.58美元(价格为4.28美元的7%),依此类推。 我的脚本在某种程度上起了作用,但随着数字的增加,我很难找到合适的数据类型。 因为我必须四舍五入到最后两位数,所以我会这样做:

int64_t c = 0;
double ergebnis = 0;
double komma1 = 0;

komma1 = komma1 + ((komma1 / 100) * 7);
c = komma1 * 100;
ergebnis = c / 100.0;
warning: operation on 'd' may be undefined [-Wsequence-point]
         d = d++;
         ~~^~~~~
问题是,如果我买了50000个苹果,这个数字会变得非常大,结果会变成一个负数。我正在使用“Visual Studio 2017社区版”

#包括“stdafx.h”
#包括“stdint.h”
#包括“iostream”
#包括“Windows.h”
使用名称空间std;
int main()
{
计算精度(40);
国际价格=4;
长期双重成本=0;
长双b=4;
int d=0;
而(d!=50000)
{
成本=价格+(价格/100*7);
价格=成本*100.00;
成本=价格/100.00;
d=d++;
}

不能尝试
long double
而不是
double

使用对精度敏感的变量执行计算时,请注意浮点精度和转换

<>在C++中使用任意大数的方法?< /p> 使用一个库,如Gnu Multiple Precision():

用于任意精度算术的免费库,对有符号整数、有理数和浮点数进行操作。除GMP运行的机器中可用内存所暗示的精度外,精度没有实际限制。GMP有一组丰富的函数,函数有一个规则的接口

但是,这些库是供高级使用的。请确保您确实需要使用这些大的数字(处理大的数字非常耗时)。

在您编辑的代码中:

首先,这是:

d = d++;
可能未定义(您应该会收到编译警告),如下所示:

int64_t c = 0;
double ergebnis = 0;
double komma1 = 0;

komma1 = komma1 + ((komma1 / 100) * 7);
c = komma1 * 100;
ergebnis = c / 100.0;
warning: operation on 'd' may be undefined [-Wsequence-point]
         d = d++;
         ~~^~~~~
将这一行代码替换为:

d++;
这相当于:

d = d + 1;

price
是一个
int
。然后执行整数除法
price/100
,结果是
int
!因此整数除法中的4/100为0。将一个操作数转换为一个浮点值,以得到一个将产生浮点数的除法。例如
(长双精度)价格/100

但是,您所描述的算法与预期结果不符。您说要从4美元到4.28美元再到4.58美元收费。实现这一目标的公式不是您所描述的公式,而是:

cost = cost + cost * 7%
此外,这两行代码毫无意义:

price = cost * 100.00;
cost = price / 100.00;
扔掉它们就行了

此外,由于您知道希望迭代执行多少次,所以请使用for循环,而不是while循环

把所有东西放在一起,你会得到:

 #include "iostream"

using namespace std;

int main()
{
    cout.precision(40);
    long double cost = 4;

    for(int i = 0; i < 50000; ++i)
    {
        cost = cost + ((long double)cost / 100 * 7);
    }
    cout << "Cost is: " << cost << endl;
    return 0;
}
#包括“iostream”
使用名称空间std;
int main()
{
计算精度(40);
长期双重成本=4;
对于(int i=0;i<50000;++i)
{
成本=成本+((长双倍)成本/100*7);
}

cout您计算复利的尝试出了可怕的错误。该程序所做的与您描述的完全相同

以下是循环的外观:

 long double price = 4.0;
 for (int i = 0; i < 50000; ++i)
 {
    price = price * 1.07; // == (100.0 + 7.0)/100.0
 }

尝试使用
长双精度
,它具有相当高的精度。此外,您可能希望查看第三方库,如Boost,以获取非常高的数字。“明显的问题是“什么明显的问题?没有看到任何问题。”-19974798308344或类似“没有”或类似的内容在整数集合中。请发布一个。这应该包括一个可构建的可运行程序、它所需的任何输入、所需的输出和实际输出。
price=cost*100.00;cost=price/100.00;
这没有意义。这段代码应该做什么?为什么你的
price
是一个整数?
d=d++
不做你想做的事是的,gsamaras已经指出了这一点。我只是犯了一些非常愚蠢的错误……嗯,
cost*100
部分应该对数字进行四舍五入,但我想我可以使用“roundl”,对吗?您好,请不要使用问候语或感谢语。问题希望在你问了一天之后很长时间都有用,而在晚上,所以你不需要祝读者一天过得愉快。谢谢你的回答!看起来长双精度实际上工作得更好,但我仍然得到一个负数。我在上面添加了一个例子,maybe这会把事情弄清楚:-)我注意到了一件事:在另一个论坛上,我读到了一些关于除数为100的文章,然后再将其乘法……但是我不能用“roundl”吗来自math.h?我只是在谷歌上搜索了一下,但我不太明白小数点后的数字是怎么定义的。感谢d++的澄清。我一直想知道这个警告是什么意思。似乎VS只是想告诉我不要再傻了:P找到帖子:好吧,我没有得到你得到的数字,我得到了“inf”.我使用的是你贴在那里的确切代码。但是…为什么?因为你使用的计算机比我的计算机有更小的限制。在wandbox.org上试试,你会看到的!唷,很高兴知道。谢谢你这么多的帮助!我真的很感激。很抱歉问了这么愚蠢的问题。作为一个初学者很差劲…:哦,我的上帝,这让人难堪…嗯,t汉克,这实际上回答了我的问题:D