#include "rkf3.h"
#include <math.h>
#include <stdlib.h>
void rkf3(void (*F)(float t1, float * y1, float * dy1), int n, float h, float *y, float t, float tout)
{
float *k1 = new float[n],
*k2 = new float[n],
*k3 = new float[n],
*yp = new float[n],
*a = new float[n],
*b = new float[n];
int i;
while (t<tout) {
F(t,y,yp);
for (i=0; i<=n-1; i++){
k1=h*yp;
a=y+k1/2;
}
F(t+h/2, a ,yp);
for (i=0; i<=n-1; i++){
k2=h*yp;
b=y+3*k2/4;
}
F(t+3*h/4, b ,yp);
for (i=0; i<=n-1; i++){
k3=h*yp;
y=y+(2*k1+3*k2+4*k3)/9;
}
t=t+h;
}
delete[] k1, k2, k3, yp, a, b;
return;
}
Преобразование double во float, интересный вопрос
Код:
А вот варнинги от вижуалки к этому файлу
Код:
rkf3.cpp(20) : warning C4244: '=' : conversion from 'double' to 'float', possible loss of data
rkf3.cpp(22) : warning C4244: 'argument' : conversion from 'double' to 'float', possible loss of data
rkf3.cpp(25) : warning C4244: '=' : conversion from 'double' to 'float', possible loss of data
rkf3.cpp(27) : warning C4244: 'argument' : conversion from 'double' to 'float', possible loss of data
rkf3.cpp(22) : warning C4244: 'argument' : conversion from 'double' to 'float', possible loss of data
rkf3.cpp(25) : warning C4244: '=' : conversion from 'double' to 'float', possible loss of data
rkf3.cpp(27) : warning C4244: 'argument' : conversion from 'double' to 'float', possible loss of data
Внимание вопрос: Окуда здесь такие варнинги если я здесь не объявляю/принимаю переменных типа double?
Очень интересно просто пипец.
Сразу для копетанов, я знаю что варнинги это не фатально, так что не надо понты нарезать, при разных коэфициентах в методе результат метода один и тотже, по этому я в непонимании этого мира пытаюсь сослаться на описанную в варнингах потерю данных.
было:
Код:
y=y+(2а*k1+3а*k2+4*k3)/9а;
сделали:
Код:
y=y+(2.0f*k1+3.0f*k2+4.0f*k3)/9.0f;
и варнинги исчезнут.
просто по молчанию цифры идудт как double для операций с плавающей точкой
Первый вариант
Цитата:
#include "rkf3.h"
#include <math.h>
#include <stdlib.h>
void rkf3(void (*F)(float t1, float * y1, float * dy1), int n, float h, float *y, float t, float tout)
{
float *k1 = new float[n],
*k2 = new float[n],
*k3 = new float[n],
*yp = new float[n],
*a = new float[n],
*b = new float[n];
int i;
while (t<tout) {
F(t,y,yp);
for (i=0; i<=n-1; i++){
k1=h*yp;
a=y+k1/2;
}
F(t+h/2, a ,yp);
for (i=0; i<=n-1; i++){
k2=h*yp;
b=y-k1+2*k2;
}
F(t+h, b ,yp);
for (i=0; i<=n-1; i++){
k3=h*yp;
y=y+(k1+4*k2+k3)/6;
}
t=t+h;
}
delete[] k1, k2, k3, yp, a, b;
return;
}
#include <math.h>
#include <stdlib.h>
void rkf3(void (*F)(float t1, float * y1, float * dy1), int n, float h, float *y, float t, float tout)
{
float *k1 = new float[n],
*k2 = new float[n],
*k3 = new float[n],
*yp = new float[n],
*a = new float[n],
*b = new float[n];
int i;
while (t<tout) {
F(t,y,yp);
for (i=0; i<=n-1; i++){
k1=h*yp;
a=y+k1/2;
}
F(t+h/2, a ,yp);
for (i=0; i<=n-1; i++){
k2=h*yp;
b=y-k1+2*k2;
}
F(t+h, b ,yp);
for (i=0; i<=n-1; i++){
k3=h*yp;
y=y+(k1+4*k2+k3)/6;
}
t=t+h;
}
delete[] k1, k2, k3, yp, a, b;
return;
}
Второй вариант:
Цитата:
#include "rkf3.h"
#include <math.h>
#include <stdlib.h>
void rkf3(void (*F)(float t1, float * y1, float * dy1), int n, float h, float *y, float t, float tout)
{
float *k1 = new float[n],
*k2 = new float[n],
*k3 = new float[n],
*yp = new float[n],
*a = new float[n],
*b = new float[n];
int i;
while (t<tout) {
F(t,y,yp);
for (i=0; i<=n-1; i++){
k1=h*yp;
a=y+k1/2;
}
F(t+h/2, a ,yp);
for (i=0; i<=n-1; i++){
k2=h*yp;
b=y+3*k2/4;
}
F(t+3*h/4, b ,yp);
for (i=0; i<=n-1; i++){
k3=h*yp;
y=y+(2*k1+3*k2+4*k3)/9;
}
t=t+h;
}
delete[] k1, k2, k3, yp, a, b;
return;
}
#include <math.h>
#include <stdlib.h>
void rkf3(void (*F)(float t1, float * y1, float * dy1), int n, float h, float *y, float t, float tout)
{
float *k1 = new float[n],
*k2 = new float[n],
*k3 = new float[n],
*yp = new float[n],
*a = new float[n],
*b = new float[n];
int i;
while (t<tout) {
F(t,y,yp);
for (i=0; i<=n-1; i++){
k1=h*yp;
a=y+k1/2;
}
F(t+h/2, a ,yp);
for (i=0; i<=n-1; i++){
k2=h*yp;
b=y+3*k2/4;
}
F(t+3*h/4, b ,yp);
for (i=0; i<=n-1; i++){
k3=h*yp;
y=y+(2*k1+3*k2+4*k3)/9;
}
t=t+h;
}
delete[] k1, k2, k3, yp, a, b;
return;
}
тему можно закрывать ответ найден
я м#дак....