|
|
|
@ -426,10 +426,124 @@ namespace taylorCos |
|
|
|
|
} |
|
|
|
|
}//namespace taylorCos
|
|
|
|
|
|
|
|
|
|
namespace taylor2 |
|
|
|
|
{ |
|
|
|
|
glm::vec4 const AngleShift(0.0f, glm::pi<float>() * 0.5f, glm::pi<float>() * 1.0f, glm::pi<float>() * 1.5f); |
|
|
|
|
|
|
|
|
|
float taylorCosA(float x) |
|
|
|
|
{ |
|
|
|
|
return 1.f |
|
|
|
|
- (x * x) * (1.f / 2.f) |
|
|
|
|
+ (x * x * x * x) * (1.f / 24.f) |
|
|
|
|
- (x * x * x * x * x * x) * (1.f / 720.f) |
|
|
|
|
+ (x * x * x * x * x * x * x * x) * (1.f / 40320.f); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
float taylorCosB(float x) |
|
|
|
|
{ |
|
|
|
|
return 1.f |
|
|
|
|
- (x * x) * (1.f / 2.f) |
|
|
|
|
+ (x * x * x * x) * (1.f / 24.f) |
|
|
|
|
- (x * x * x * x * x * x) * (1.f / 720.f) |
|
|
|
|
+ (x * x * x * x * x * x * x * x) * (1.f / 40320.f); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
float taylorCosC(float x) |
|
|
|
|
{ |
|
|
|
|
return 1.f |
|
|
|
|
- (x * x) * (1.f / 2.f) |
|
|
|
|
+ ((x * x) * (x * x)) * (1.f / 24.f) |
|
|
|
|
- (((x * x) * (x * x)) * (x * x)) * (1.f / 720.f) |
|
|
|
|
+ (((x * x) * (x * x)) * ((x * x) * (x * x))) * (1.f / 40320.f); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int perf_taylorCosA(float Begin, float End, std::size_t Samples) |
|
|
|
|
{ |
|
|
|
|
std::vector<float> Results; |
|
|
|
|
Results.resize(Samples); |
|
|
|
|
|
|
|
|
|
float Steps = (End - Begin) / Samples; |
|
|
|
|
|
|
|
|
|
std::clock_t const TimeStampBegin = std::clock(); |
|
|
|
|
|
|
|
|
|
for(std::size_t i = 0; i < Samples; ++i) |
|
|
|
|
Results[i] = taylorCosA(AngleShift.x + Begin + Steps * i); |
|
|
|
|
|
|
|
|
|
std::clock_t const TimeStampEnd = std::clock(); |
|
|
|
|
|
|
|
|
|
std::printf("taylorCosA %ld clocks\n", TimeStampEnd - TimeStampBegin); |
|
|
|
|
|
|
|
|
|
int Error = 0; |
|
|
|
|
for(std::size_t i = 0; i < Samples; ++i) |
|
|
|
|
Error += Results[i] >= -1.0f && Results[i] <= 1.0f ? 0 : 1; |
|
|
|
|
return Error; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int perf_taylorCosB(float Begin, float End, std::size_t Samples) |
|
|
|
|
{ |
|
|
|
|
std::vector<float> Results; |
|
|
|
|
Results.resize(Samples); |
|
|
|
|
|
|
|
|
|
float Steps = (End - Begin) / Samples; |
|
|
|
|
|
|
|
|
|
std::clock_t const TimeStampBegin = std::clock(); |
|
|
|
|
|
|
|
|
|
for(std::size_t i = 0; i < Samples; ++i) |
|
|
|
|
Results[i] = taylorCosB(AngleShift.x + Begin + Steps * i); |
|
|
|
|
|
|
|
|
|
std::clock_t const TimeStampEnd = std::clock(); |
|
|
|
|
|
|
|
|
|
std::printf("taylorCosB %ld clocks\n", TimeStampEnd - TimeStampBegin); |
|
|
|
|
|
|
|
|
|
int Error = 0; |
|
|
|
|
for(std::size_t i = 0; i < Samples; ++i) |
|
|
|
|
Error += Results[i] >= -1.0f && Results[i] <= 1.0f ? 0 : 1; |
|
|
|
|
return Error; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int perf_taylorCosC(float Begin, float End, std::size_t Samples) |
|
|
|
|
{ |
|
|
|
|
std::vector<float> Results; |
|
|
|
|
Results.resize(Samples); |
|
|
|
|
|
|
|
|
|
float Steps = (End - Begin) / Samples; |
|
|
|
|
|
|
|
|
|
std::clock_t const TimeStampBegin = std::clock(); |
|
|
|
|
|
|
|
|
|
for(std::size_t i = 0; i < Samples; ++i) |
|
|
|
|
Results[i] = taylorCosC(AngleShift.x + Begin + Steps * i); |
|
|
|
|
|
|
|
|
|
std::clock_t const TimeStampEnd = std::clock(); |
|
|
|
|
|
|
|
|
|
std::printf("taylorCosC %ld clocks\n", TimeStampEnd - TimeStampBegin); |
|
|
|
|
|
|
|
|
|
int Error = 0; |
|
|
|
|
for(std::size_t i = 0; i < Samples; ++i) |
|
|
|
|
Error += Results[i] >= -1.0f && Results[i] <= 1.0f ? 0 : 1; |
|
|
|
|
return Error; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int perf(std::size_t Samples) |
|
|
|
|
{ |
|
|
|
|
int Error = 0; |
|
|
|
|
|
|
|
|
|
float const Begin = -glm::pi<float>(); |
|
|
|
|
float const End = glm::pi<float>(); |
|
|
|
|
|
|
|
|
|
Error += perf_taylorCosA(Begin, End, Samples); |
|
|
|
|
Error += perf_taylorCosB(Begin, End, Samples); |
|
|
|
|
Error += perf_taylorCosC(Begin, End, Samples); |
|
|
|
|
|
|
|
|
|
return Error; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
}//namespace taylor2
|
|
|
|
|
|
|
|
|
|
int main() |
|
|
|
|
{ |
|
|
|
|
int Error(0); |
|
|
|
|
|
|
|
|
|
Error += ::taylor2::perf(1000); |
|
|
|
|
Error += ::taylorCos::test(); |
|
|
|
|
Error += ::taylorCos::perf(1000); |
|
|
|
|
|
|
|
|
|