将float类型的数组转换为double

时间:2016-03-17 01:05:42

标签: c++ arrays

我真的需要帮助学习如何将不同类型的数组转换为双精度(short,long,float)。我不确定如何更好地提出这个问题。这是为了学校的任务。我知道作业并不完整,我只需要在继续为短篇和长篇做数组之前学会这样做。

Assignment Description:

我们将扩展程序以考虑不同的原语。该实现将实现程序2中描述的所有8个功能作为模板。为了显示这一点,main函数将声明包含10个值的4个不同数组。不同的数组将被声明为short,long,float和double。每个数组都将填充来自随机数生成器的随机值。将打印阵列,然后将调用8个函数中的每个函数并将结果打印给用户。为了提供容器,每个函数都将成为名为“MathHelper”的类的一部分,该类具有使用公共访问修饰符和静态修饰符声明的所有函数。

MathHelper.h

#pragma once
class MathHelper
{
  public:
    static double calculateSum(const double numbers[], const int& count);
    static double calculateAverage(const double numbers[], const int& count);
    static int highestNum(const double numbers[], const int& count);
    //int lowestNum(const int numbers[], const int& count);
    //int numRange(const int numbers[], const int& count);
    //double standardDeviation(const int numbers[], const int& count);
    //int smallestFactorial(const int numbers[], const int& count);
};

MathHelper.cpp

#include "MathHelper.h"



MathHelper::MathHelper()
{
}

double MathHelper::calculateSum(const double numbers[], const int& count)
{
     if (count <= 0)
        return 0;
     double total = 0;
     for (int i = 0; i < count; i++)
         total += numbers[i];
     return total;
}

double MathHelper::calculateAverage(const double numbers[], const int& count)
{
     if (count <= 0)
         return 0;
     return static_cast<double>(calculateSum(numbers, count)) / count;
}

int MathHelper::highestNum(const double numbers[], const int& count)
{
     if (count <= 0)
        return 0;
     int highest = numbers[0];
    for (int i = 1; i < count; ++i)
        if (highest < numbers[i])
             highest = numbers[i];
    return highest;
}


MathHelper::~MathHelper()
{
}

Program4.cpp

// Program4Fix.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "MathHelper.h"
#include <iostream>
#include <cmath>
#include <ctime>
#include <iomanip>


int main()
{
    const int size = 10;
    double* myDoubles = new double[size];
    float* myFloats = new double[size];

    srand((unsigned)time(NULL));


    // double fill
    std::cout << std::endl;
    std::cout << "Double Array: \n";
    for (int i = 0; i < size; i++)
    {
        *(myDoubles + i) = rand() / double(RAND_MAX)*50.f + 1.f;
        std::cout << i << ": " << std::setprecision(4) << *(myDoubles + i) << std::endl;
    }
    std::cout << std::setprecision(5) << "The sum of the numbers is: " << MathHelper::calculateSum(myDoubles, size) << "\n";
    std::cout << std::setprecision(5) << "The average of the numbers is: " << MathHelper::calculateAverage(myDoubles, size) << "\n";


    // long fill
    std::cout << "Float Array: \n";
    for (int i = 0; i < size; i++)
    {
        *(myFloats + i) = rand() / float(RAND_MAX)*50.f + 1.f;
        std::cout << i << ": " << std::setprecision(4) << *(myFloats + i) << std::endl;
    }
    std::cout << std::setprecision(5) << "The sum of the numbers is: " << MathHelper::calculateSum(myFloats, size) << "\n";
    std::cout << std::setprecision(5) << "The average of the numbers is: " << MathHelper::calculateAverage(myFloats, size) << "\n";




    return 0;
}

我想我真正的问题是,无论如何使用double *类型的值来初始化float *类型的实体?

const int size = 10;
double* myDoubles = new double[size]; // this works
float* myFloats = new double[size]; // this doesn't work, is there a way to do this similar to the one above?

3 个答案:

答案 0 :(得分:0)

由于您在询问C ++,请不要使用隐式转换

double d = 1.5;
int i = d;

也不要使用c风格的演员:

double d = 1.5;
int i = (int)d;

使用适当的铸造

int i = static_cast<int>(d);

你可以阅读为什么,有很多理由可以使用C ++进行转换。

要转换数组,您需要创建一个新数组,然后迭代现有数组,逐个转换,然后将它们分配给新数组。

对于C ++ 11,您可以使用std :: transform()函数。

答案 1 :(得分:0)

我想你应该做的是将MathHelper中的函数概括为模板函数,这些函数可以用于double以外的其他类型。我会得到一本不错的C ++书籍并阅读有关模板函数的内容,例如:在A Tour of C++Programming -- Principles and Practice Using C++中。您可以从isocpp.org获取Tour of C ++的前四章,第二章介绍模板。

最后,您应该拥有类似

的代码
class MathHelper
{
  public:
    template<typename T> static double calculateSum(const T numbers[], const int& count);
};

作为一般性评论,发布的代码看起来非常C-ish意味着它使用C构造,其中C ++具有更好的替代方案,例如手动管理的数组而不是std::vector。你应该避免这种情况。

答案 2 :(得分:-1)

floatintlong转换为double就像将源变量分配给声明为double的变量一样简单。

例如:

int a = 1
long b = 2;
float c = 3.0f;
double result;

result = a;
result = b;
result = c;

在最后3个陈述中,这些值将转换为双倍。

您也可以通过投射转换其他方式。

const int size = 10;
double* myDoubles = new double[size];
float* myFloats = new float[size];
InitializeArray(myDoubles); // You'll have to start with some values
for(int i = 0; size > i; ++i)
{
  myFloats[i] = (float) myDoubles[i];
}