首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >计算圆的面积

计算圆的面积
EN

Code Review用户
提问于 2015-06-27 22:28:11
回答 3查看 889关注 0票数 8

这是我在某个公司的招聘过程中必须完成的任务之一。不幸的是,他们不喜欢它,所以我决定在这里分享它供讨论。

CircleArea.h

代码语言:javascript
运行
复制
#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

代码语言:javascript
运行
复制
#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;
}

为什么招聘人员会不喜欢这个解决方案呢?

EN

回答 3

Code Review用户

发布于 2015-06-27 22:51:24

我想其中的抱怨之一就是不断的抱怨。计算pi有多种方法,使用精确的计算,而不是使用一定数量的数字。

下面是一个例子(在C++14中):

代码语言:javascript
运行
复制
constexpr auto pi()
{
    return std::acos(-1);
}

(对于C++11,使用非auto类型,如doublefloat。)

constexpr关键字将允许在编译时计算这个值。您仍然可以将返回值赋值给常量,或者在需要时内联调用函数。如果没有C++11,则可以使用const代替constexpr,只需将其赋值给常量即可。

票数 11
EN

Code Review用户

发布于 2016-08-01 22:13:52

名字空间拥挤?

代码语言:javascript
运行
复制
const double PI = 3.141592653589793115997963468544185161590576171875;

就像令人垂涎的1和2个字母URL一样,创建一个名为PI的常量可以很容易地与其他代码发生冲突。而且,PI看上去就像一个#define,适合我的口味。

代码语言:javascript
运行
复制
#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

票数 1
EN

Code Review用户

发布于 2016-08-01 22:46:18

可以改进原始代码中的两项:

  1. 在math.h中使用预定义的常量M_PI
  2. 不需要特别检查radius <0,因为(-r * -r) == (r * r)。
票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/94936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档