这是我在某个公司的招聘过程中必须完成的任务之一。不幸的是,他们不喜欢它,所以我决定在这里分享它供讨论。
CircleArea.h
#ifndef CIRCLEAREA_H_
#define CIRCLEAREA_H_
//PI Number, with max precision for double (8 bytes)
const double PI = 3.141592653589793115997963468544185161590576171875;
double circleArea(double radius);
#endif
CircleArea.cpp
#include "CircleArea.h"
#include <stdexcept>
double circleArea(double radius)
{
if(radius < 0)
{
throw std::invalid_argument("Radius cannot be less than zero");
}
return PI * radius * radius;
}
为什么招聘人员会不喜欢这个解决方案呢?
发布于 2015-06-27 22:51:24
我想其中的抱怨之一就是不断的抱怨。计算pi有多种方法,使用精确的计算,而不是使用一定数量的数字。
下面是一个例子(在C++14中):
constexpr auto pi()
{
return std::acos(-1);
}
(对于C++11,使用非auto
类型,如double
或float
。)
constexpr
关键字将允许在编译时计算这个值。您仍然可以将返回值赋值给常量,或者在需要时内联调用函数。如果没有C++11,则可以使用const
代替constexpr
,只需将其赋值给常量即可。
发布于 2016-08-01 22:13:52
名字空间拥挤?
const double PI = 3.141592653589793115997963468544185161590576171875;
就像令人垂涎的1和2个字母URL一样,创建一个名为PI
的常量可以很容易地与其他代码发生冲突。而且,PI
看上去就像一个#define
,适合我的口味。
#include <cmath>
double circleArea(double radius) {
static const double pi = std::acos(-1); // Or some variation
return pi * radius * radius;
}
顺便说一句,OP的PI * radius * radius
相对于radius * radius * PI
有一个小的优势,因为radius * radius
的价值可能低于sqrt(DBL_TRUE_MIN)
,而不是PI * radius * radius
。
发布于 2016-08-01 22:46:18
可以改进原始代码中的两项:
M_PI
。https://codereview.stackexchange.com/questions/94936
复制相似问题